aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-07-01 07:21:10 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-07-01 07:21:10 -0300
commit6243967f1fac3af8ed3e72790cabed0f79978bdb (patch)
tree35f0d27b4c280622c368a9fa94815b8deb7a990f
parent6c8aa85b8b578db03a8c5f0dc0b7e80605592d45 (diff)
downloadgame-6243967f1fac3af8ed3e72790cabed0f79978bdb.tar.gz
game-6243967f1fac3af8ed3e72790cabed0f79978bdb.zip
fix `operator=` for `TChannel`, `TParty`, and `THouse`
I had focused on copying the `vector` fields for theses structs but, being the copy operator, you need to copy everything over.
-rw-r--r--reference/enums.hh11
-rw-r--r--src/common.hh12
-rw-r--r--src/houses.cc40
-rw-r--r--src/houses.hh2
-rw-r--r--src/operate.cc5
-rw-r--r--src/reader.cc6
-rw-r--r--src/reader.hh17
-rw-r--r--src/writer.cc56
-rw-r--r--src/writer.hh58
9 files changed, 130 insertions, 77 deletions
diff --git a/reference/enums.hh b/reference/enums.hh
index 2f95bfb..47d5196 100644
--- a/reference/enums.hh
+++ b/reference/enums.hh
@@ -8,14 +8,3 @@ enum CHANNEL: int {
REALLIFE_CHANNEL=6,
HELP_CHANNEL=7
};
-
-enum TReaderThreadOrderType: int {
- ORDER_TERMINATE=0,
- ORDER_LOADSECTOR=1,
- ORDER_LOADCHARACTER=2
-};
-
-enum TReaderThreadReplyType: int {
- REPLY_SECTORDATA=0,
- REPLY_CHARACTERDATA=1
-};
diff --git a/src/common.hh b/src/common.hh
index 8aef0fd..57c7745 100644
--- a/src/common.hh
+++ b/src/common.hh
@@ -29,12 +29,6 @@ typedef size_t usize;
#define MB(x) ((usize)(x) << 20)
#define GB(x) ((usize)(x) << 30)
-// TODO(fusion): We might not actually compile the output for the decompilation
-// step but if we did, we'd need to make sure we're compiling in 32 bits mode.
-STATIC_ASSERT(sizeof(bool) == 1);
-STATIC_ASSERT(sizeof(int) == 4);
-//STATIC_ASSERT(sizeof(void*) == 4);
-
#if !OS_WINDOWS && !OS_LINUX
# if defined(_WIN32)
# define OS_WINDOWS 1
@@ -55,7 +49,6 @@ STATIC_ASSERT(sizeof(int) == 4);
# endif
#endif
-// NOTE(fusion): Compiler attributes.
#if COMPILER_GCC || COMPILER_CLANG
# define ATTR_FALLTHROUGH __attribute__((fallthrough))
# define ATTR_PRINTF(x, y) __attribute__((format(printf, x, y)))
@@ -83,8 +76,11 @@ STATIC_ASSERT(sizeof(int) == 4);
// original code but only for reference. Making it compile on Windows shouldn't
// be too difficult either. Overall this design is outdated and should be reviewed.
// Nevertheless, we should focus on getting it working as intended, on the target
-// platform (which is Linux 32-bits) before attempting to refine it.
+// platform (which is Linux 32-bit) before attempting to refine it.
STATIC_ASSERT(OS_LINUX);
+STATIC_ASSERT(sizeof(bool) == 1);
+STATIC_ASSERT(sizeof(int) == 4);
+//STATIC_ASSERT(sizeof(void*) == 4);
#include <errno.h>
#include <unistd.h>
diff --git a/src/houses.cc b/src/houses.cc
index 16bc0ee..b47138e 100644
--- a/src/houses.cc
+++ b/src/houses.cc
@@ -20,6 +20,46 @@ static int MaxHouseY;
static TQueryManagerConnection *QueryManagerConnection;
static int PaymentExtension;
+THouse::THouse(void) : Subowner(0, 4, 5), Guest(0, 9, 10) {
+ // no-op
+}
+
+THouse::THouse(const THouse &Other) : THouse() {
+ this->operator=(Other);
+}
+
+void THouse::operator=(const THouse &Other){
+ this->ID = Other.ID;
+ memcpy(this->Name, Other.Name, sizeof(this->Name));
+ memcpy(this->Description, Other.Description, sizeof(this->Description));
+ this->Size = Other.Size;
+ this->Rent = Other.Rent;
+ this->DepotNr = Other.DepotNr;
+ this->NoAuction = Other.NoAuction;
+ this->GuildHouse = Other.GuildHouse;
+ this->ExitX = Other.ExitX;
+ this->ExitY = Other.ExitY;
+ this->ExitZ = Other.ExitZ;
+ this->CenterX = Other.CenterX;
+ this->CenterY = Other.CenterY;
+ this->CenterZ = Other.CenterZ;
+ this->OwnerID = Other.OwnerID;
+ memcpy(this->OwnerName, Other.OwnerName, sizeof(this->OwnerName));
+ this->LastTransition = Other.LastTransition;
+ this->PaidUntil = Other.PaidUntil;
+ this->Help = Other.Help;
+
+ this->Subowners = Other.Subowners;
+ for(int i = 0; i < Other.Subowners; i += 1){
+ *this->Subowner.at(i) = Other.Subowner.copyAt(i);
+ }
+
+ this->Guests = Other.Guests;
+ for(int i = 0; i < Other.Guests; i += 1){
+ *this->Guest.at(i) = Other.Guest.copyAt(i);
+ }
+}
+
THouseArea *GetHouseArea(uint16 ID){
THouseArea *Result = NULL;
for(int i = 0; i < HouseAreas; i += 1){
diff --git a/src/houses.hh b/src/houses.hh
index 8402bf2..65c6b19 100644
--- a/src/houses.hh
+++ b/src/houses.hh
@@ -27,7 +27,7 @@ struct THouseGuest {
};
struct THouse {
- THouse(void) : Subowner(0, 4, 5), Guest(0, 9, 10) {}
+ THouse(void);
// TODO(fusion): Same as `TChannel` in `operate.hh`.
THouse(const THouse &Other);
diff --git a/src/operate.cc b/src/operate.cc
index a9644c2..7099cc1 100644
--- a/src/operate.cc
+++ b/src/operate.cc
@@ -3357,6 +3357,9 @@ TChannel::TChannel(const TChannel &Other) : TChannel() {
}
void TChannel::operator=(const TChannel &Other){
+ this->Moderator = Other.Moderator;
+ memcpy(this->ModeratorName, Other.ModeratorName, sizeof(this->ModeratorName));
+
this->Subscribers = Other.Subscribers;
for(int i = 0; i < Other.Subscribers; i += 1){
*this->Subscriber.at(i) = Other.Subscriber.copyAt(i);
@@ -3814,6 +3817,8 @@ TParty::TParty(const TParty &Other) : TParty() {
}
void TParty::operator=(const TParty &Other){
+ this->Leader = Other.Leader;
+
this->Members = Other.Members;
for(int i = 0; i < Other.Members; i += 1){
*this->Member.at(i) = Other.Member.copyAt(i);
diff --git a/src/reader.cc b/src/reader.cc
new file mode 100644
index 0000000..f2da968
--- /dev/null
+++ b/src/reader.cc
@@ -0,0 +1,6 @@
+#include "reader.hh"
+#include "threads.hh"
+
+static Semaphore OrderBufferEmpty(200);
+static Semaphore OrderBufferFull(0);
+static TDynamicWriteBuffer HelpBuffer(KB(64));
diff --git a/src/reader.hh b/src/reader.hh
new file mode 100644
index 0000000..2dbf02f
--- /dev/null
+++ b/src/reader.hh
@@ -0,0 +1,17 @@
+#ifndef TIBIA_READER_HH_
+#define TIBIA_READER_HH_ 1
+
+#include "common.hh"
+
+enum TReaderThreadOrderType: int {
+ READER_ORDER_TERMINATE = 0,
+ READER_ORDER_LOADSECTOR = 1,
+ READER_ORDER_LOADCHARACTER = 2,
+};
+
+enum TReaderThreadReplyType: int {
+ READER_REPLY_SECTORDATA = 0,
+ READER_REPLY_CHARACTERDATA = 1,
+};
+
+#endif //TIBIA_READER_HH
diff --git a/src/writer.cc b/src/writer.cc
index 1b84e98..f4d5589 100644
--- a/src/writer.cc
+++ b/src/writer.cc
@@ -12,13 +12,13 @@ static TProtocolThreadOrder ProtocolBuffer[1000];
static int ProtocolPointerWrite;
static int ProtocolPointerRead;
static Semaphore ProtocolMutex(1);
-static Semaphore ProtocolBufferEmpty(1000);
+static Semaphore ProtocolBufferEmpty(NARRAY(ProtocolBuffer));
static Semaphore ProtocolBufferFull(0);
static TWriterThreadOrder OrderBuffer[2000];
static int OrderPointerWrite;
static int OrderPointerRead;
-static Semaphore OrderBufferEmpty(2000);
+static Semaphore OrderBufferEmpty(NARRAY(OrderBuffer));
static Semaphore OrderBufferFull(0);
static TWriterThreadReply ReplyBuffer[100];
@@ -204,7 +204,7 @@ void GetOrder(TWriterThreadOrder *Order){
}
void TerminateWriterOrder(void){
- InsertOrder(ORDER_TERMINATE, NULL);
+ InsertOrder(WRITER_ORDER_TERMINATE, NULL);
}
void LogoutOrder(TPlayer *Player){
@@ -252,7 +252,7 @@ void LogoutOrder(TPlayer *Player){
strcpy(Data->Residence, "Unknown");
}
- InsertOrder(ORDER_LOGOUT, Data);
+ InsertOrder(WRITER_ORDER_LOGOUT, Data);
}
void PlayerlistOrder(int NumberOfPlayers, const char *PlayerNames,
@@ -278,7 +278,7 @@ void PlayerlistOrder(int NumberOfPlayers, const char *PlayerNames,
Data->PlayerLevels = PlayerLevels;
Data->PlayerProfessions = PlayerProfessions;
- InsertOrder(ORDER_PLAYERLIST, Data);
+ InsertOrder(WRITER_ORDER_PLAYERLIST, Data);
}
void KillStatisticsOrder(int NumberOfRaces, const char *RaceNames,
@@ -304,7 +304,7 @@ void KillStatisticsOrder(int NumberOfRaces, const char *RaceNames,
Data->KilledPlayers = KilledPlayers;
Data->KilledCreatures = KilledCreatures;
- InsertOrder(ORDER_KILLSTATISTICS, Data);
+ InsertOrder(WRITER_ORDER_KILLSTATISTICS, Data);
}
void PunishmentOrder(TCreature *Gamemaster, const char *Name, const char *IPAddress,
@@ -339,7 +339,7 @@ void PunishmentOrder(TCreature *Gamemaster, const char *Name, const char *IPAddr
Data->StatementID = StatementID;
Data->IPBanishment = IPBanishment;
- InsertOrder(ORDER_PUNISHMENT, Data);
+ InsertOrder(WRITER_ORDER_PUNISHMENT, Data);
}
void CharacterDeathOrder(TCreature *Creature, int OldLevel,
@@ -362,7 +362,7 @@ void CharacterDeathOrder(TCreature *Creature, int OldLevel,
Data->Unjustified = Unjustified;
Data->Time = time(NULL);
- InsertOrder(ORDER_CHARACTERDEATH, Data);
+ InsertOrder(WRITER_ORDER_CHARACTERDEATH, Data);
}
void AddBuddyOrder(TCreature *Creature, uint32 BuddyID){
@@ -380,7 +380,7 @@ void AddBuddyOrder(TCreature *Creature, uint32 BuddyID){
Data->AccountID = ((TPlayer*)Creature)->AccountID;
Data->Buddy = BuddyID;
- InsertOrder(ORDER_ADDBUDDY, Data);
+ InsertOrder(WRITER_ORDER_ADDBUDDY, Data);
}
void RemoveBuddyOrder(TCreature *Creature, uint32 BuddyID){
@@ -398,16 +398,16 @@ void RemoveBuddyOrder(TCreature *Creature, uint32 BuddyID){
Data->AccountID = ((TPlayer*)Creature)->AccountID;
Data->Buddy = BuddyID;
- InsertOrder(ORDER_REMOVEBUDDY, Data);
+ InsertOrder(WRITER_ORDER_REMOVEBUDDY, Data);
}
void DecrementIsOnlineOrder(uint32 CharacterID){
void *Data = (void*)((uintptr)CharacterID);
- InsertOrder(ORDER_DECREMENTISONLINE, Data);
+ InsertOrder(WRITER_ORDER_DECREMENTISONLINE, Data);
}
void SavePlayerDataOrder(void){
- InsertOrder(ORDER_SAVEPLAYERDATA, NULL);
+ InsertOrder(WRITER_ORDER_SAVEPLAYERDATA, NULL);
}
void ProcessLogoutOrder(TLogoutOrderData *Data){
@@ -781,53 +781,53 @@ int WriterThreadLoop(void *Unused){
TWriterThreadOrder Order = {};
while(true){
GetOrder(&Order);
- if(Order.OrderType == ORDER_TERMINATE){
+ if(Order.OrderType == WRITER_ORDER_TERMINATE){
break;
}
switch(Order.OrderType){
- case ORDER_LOGOUT:{
+ case WRITER_ORDER_LOGOUT:{
ProcessLogoutOrder((TLogoutOrderData*)Order.Data);
break;
}
- case ORDER_PLAYERLIST:{
+ case WRITER_ORDER_PLAYERLIST:{
ProcessPlayerlistOrder((TPlayerlistOrderData*)Order.Data);
break;
}
- case ORDER_KILLSTATISTICS:{
+ case WRITER_ORDER_KILLSTATISTICS:{
ProcessKillStatisticsOrder((TKillStatisticsOrderData*)Order.Data);
break;
}
- case ORDER_PUNISHMENT:{
+ case WRITER_ORDER_PUNISHMENT:{
ProcessPunishmentOrder((TPunishmentOrderData*)Order.Data);
break;
}
- case ORDER_CHARACTERDEATH:{
+ case WRITER_ORDER_CHARACTERDEATH:{
ProcessCharacterDeathOrder((TCharacterDeathOrderData*)Order.Data);
break;
}
- case ORDER_ADDBUDDY:{
+ case WRITER_ORDER_ADDBUDDY:{
ProcessAddBuddyOrder((TBuddyOrderData*)Order.Data);
break;
}
- case ORDER_REMOVEBUDDY:{
+ case WRITER_ORDER_REMOVEBUDDY:{
ProcessRemoveBuddyOrder((TBuddyOrderData*)Order.Data);
break;
}
- case ORDER_DECREMENTISONLINE:{
+ case WRITER_ORDER_DECREMENTISONLINE:{
uint32 CharacterID = (uint32)((uintptr)Order.Data);
ProcessDecrementIsOnlineOrder(CharacterID);
break;
}
- case ORDER_SAVEPLAYERDATA:{
+ case WRITER_ORDER_SAVEPLAYERDATA:{
SavePlayerPoolSlots();
break;
}
@@ -870,7 +870,7 @@ void BroadcastReply(const char *Text, ...){
vsnprintf(Data->Message, sizeof(Data->Message), Text, ap);
va_end(ap);
- InsertReply(REPLY_BROADCAST, Data);
+ InsertReply(WRITER_REPLY_BROADCAST, Data);
}
void DirectReply(uint32 CharacterID, const char *Text, ...){
@@ -891,7 +891,7 @@ void DirectReply(uint32 CharacterID, const char *Text, ...){
vsnprintf(Data->Message, sizeof(Data->Message), Text, ap);
va_end(ap);
- InsertReply(REPLY_DIRECT, Data);
+ InsertReply(WRITER_REPLY_DIRECT, Data);
}
void LogoutReply(const char *PlayerName){
@@ -902,7 +902,7 @@ void LogoutReply(const char *PlayerName){
// TODO(fusion): Probably some string dup function?
char *Data = new char[strlen(PlayerName) + 1];
strcpy(Data, PlayerName);
- InsertReply(REPLY_LOGOUT, Data);
+ InsertReply(WRITER_REPLY_LOGOUT, Data);
}
bool GetReply(TWriterThreadReply *Reply){
@@ -958,17 +958,17 @@ void ProcessWriterThreadReplies(void){
TWriterThreadReply Reply = {};
while(GetReply(&Reply)){
switch(Reply.ReplyType){
- case REPLY_BROADCAST:{
+ case WRITER_REPLY_BROADCAST:{
ProcessBroadcastReply((TBroadcastReplyData*)Reply.Data);
break;
}
- case REPLY_DIRECT:{
+ case WRITER_REPLY_DIRECT:{
ProcessDirectReply((TDirectReplyData*)Reply.Data);
break;
}
- case REPLY_LOGOUT:{
+ case WRITER_REPLY_LOGOUT:{
ProcessLogoutReply((const char*)Reply.Data);
break;
}
diff --git a/src/writer.hh b/src/writer.hh
index 8c87c0f..d7ea226 100644
--- a/src/writer.hh
+++ b/src/writer.hh
@@ -5,23 +5,23 @@
#include "containers.hh"
#include "operate.hh"
-enum TWriterThreadReplyType: int {
- REPLY_BROADCAST = 0,
- REPLY_DIRECT = 1,
- REPLY_LOGOUT = 2,
+enum TWriterThreadOrderType: int {
+ WRITER_ORDER_TERMINATE = 0,
+ WRITER_ORDER_LOGOUT = 1,
+ WRITER_ORDER_PLAYERLIST = 2,
+ WRITER_ORDER_KILLSTATISTICS = 3,
+ WRITER_ORDER_PUNISHMENT = 4,
+ WRITER_ORDER_CHARACTERDEATH = 5,
+ WRITER_ORDER_ADDBUDDY = 6,
+ WRITER_ORDER_REMOVEBUDDY = 7,
+ WRITER_ORDER_DECREMENTISONLINE = 8,
+ WRITER_ORDER_SAVEPLAYERDATA = 9,
};
-enum TWriterThreadOrderType: int {
- ORDER_TERMINATE = 0,
- ORDER_LOGOUT = 1,
- ORDER_PLAYERLIST = 2,
- ORDER_KILLSTATISTICS = 3,
- ORDER_PUNISHMENT = 4,
- ORDER_CHARACTERDEATH = 5,
- ORDER_ADDBUDDY = 6,
- ORDER_REMOVEBUDDY = 7,
- ORDER_DECREMENTISONLINE = 8,
- ORDER_SAVEPLAYERDATA = 9,
+enum TWriterThreadReplyType: int {
+ WRITER_REPLY_BROADCAST = 0,
+ WRITER_REPLY_DIRECT = 1,
+ WRITER_REPLY_LOGOUT = 2,
};
struct TProtocolThreadOrder{
@@ -29,20 +29,6 @@ struct TProtocolThreadOrder{
char Text[256];
};
-struct TWriterThreadReply{
- TWriterThreadReplyType ReplyType;
- const void *Data;
-};
-
-struct TBroadcastReplyData{
- char Message[100];
-};
-
-struct TDirectReplyData{
- uint32 CharacterID;
- char Message[100];
-};
-
struct TWriterThreadOrder{
TWriterThreadOrderType OrderType;
const void *Data;
@@ -99,6 +85,20 @@ struct TBuddyOrderData{
uint32 Buddy;
};
+struct TWriterThreadReply{
+ TWriterThreadReplyType ReplyType;
+ const void *Data;
+};
+
+struct TBroadcastReplyData{
+ char Message[100];
+};
+
+struct TDirectReplyData{
+ uint32 CharacterID;
+ char Message[100];
+};
+
void InitProtocol(void);
void InsertProtocolOrder(const char *ProtocolName, const char *Text);
void GetProtocolOrder(TProtocolThreadOrder *Order);