diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-07-01 07:21:10 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-07-01 07:21:10 -0300 |
| commit | 6243967f1fac3af8ed3e72790cabed0f79978bdb (patch) | |
| tree | 35f0d27b4c280622c368a9fa94815b8deb7a990f /src | |
| parent | 6c8aa85b8b578db03a8c5f0dc0b7e80605592d45 (diff) | |
| download | game-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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/common.hh | 12 | ||||
| -rw-r--r-- | src/houses.cc | 40 | ||||
| -rw-r--r-- | src/houses.hh | 2 | ||||
| -rw-r--r-- | src/operate.cc | 5 | ||||
| -rw-r--r-- | src/reader.cc | 6 | ||||
| -rw-r--r-- | src/reader.hh | 17 | ||||
| -rw-r--r-- | src/writer.cc | 56 | ||||
| -rw-r--r-- | src/writer.hh | 58 |
8 files changed, 130 insertions, 66 deletions
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); |
