From c4dfe97e95846b43c578b3be35d0ef69f9b50e94 Mon Sep 17 00:00:00 2001 From: fusion32 Date: Sun, 22 Jun 2025 00:52:27 -0300 Subject: `sending.cc` --- Makefile | 6 +- TODO.md | 1 - reference/game.c | 6564 ---------------------------------------------------- src/connections.cc | 78 +- src/connections.hh | 208 ++ src/operate.hh | 3 - src/sending.cc | 1751 ++++++++++++++ src/stubs.hh | 55 - 8 files changed, 1969 insertions(+), 6697 deletions(-) create mode 100644 src/sending.cc diff --git a/Makefile b/Makefile index c0632aa..357ae64 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ endif HEADERS = $(SRCDIR)/common.hh $(SRCDIR)/communication.hh $(SRCDIR)/config.hh $(SRCDIR)/connections.hh $(SRCDIR)/containers.hh $(SRCDIR)/cr.hh $(SRCDIR)/crypto.hh $(SRCDIR)/enums.hh $(SRCDIR)/info.hh $(SRCDIR)/magic.hh $(SRCDIR)/map.hh $(SRCDIR)/moveuse.hh $(SRCDIR)/objects.hh $(SRCDIR)/operate.hh $(SRCDIR)/query.hh $(SRCDIR)/script.hh $(SRCDIR)/stubs.hh $(SRCDIR)/threads.hh -$(BUILDDIR)/$(OUTPUTEXE): $(BUILDDIR)/communication.obj $(BUILDDIR)/config.obj $(BUILDDIR)/connections.obj $(BUILDDIR)/cract.obj $(BUILDDIR)/crcombat.obj $(BUILDDIR)/crmain.obj $(BUILDDIR)/crplayer.obj $(BUILDDIR)/crskill.obj $(BUILDDIR)/crypto.obj $(BUILDDIR)/info.obj $(BUILDDIR)/magic.obj $(BUILDDIR)/main.obj $(BUILDDIR)/map.obj $(BUILDDIR)/moveuse.obj $(BUILDDIR)/objects.obj $(BUILDDIR)/operate.obj $(BUILDDIR)/query.obj $(BUILDDIR)/script.obj $(BUILDDIR)/shm.obj $(BUILDDIR)/strings.obj $(BUILDDIR)/threads.obj $(BUILDDIR)/time.obj $(BUILDDIR)/utils.obj +$(BUILDDIR)/$(OUTPUTEXE): $(BUILDDIR)/communication.obj $(BUILDDIR)/config.obj $(BUILDDIR)/connections.obj $(BUILDDIR)/cract.obj $(BUILDDIR)/crcombat.obj $(BUILDDIR)/crmain.obj $(BUILDDIR)/crplayer.obj $(BUILDDIR)/crskill.obj $(BUILDDIR)/crypto.obj $(BUILDDIR)/info.obj $(BUILDDIR)/magic.obj $(BUILDDIR)/main.obj $(BUILDDIR)/map.obj $(BUILDDIR)/moveuse.obj $(BUILDDIR)/objects.obj $(BUILDDIR)/operate.obj $(BUILDDIR)/query.obj $(BUILDDIR)/script.obj $(BUILDDIR)/sending.obj $(BUILDDIR)/shm.obj $(BUILDDIR)/strings.obj $(BUILDDIR)/threads.obj $(BUILDDIR)/time.obj $(BUILDDIR)/utils.obj @echo $(CC) $(CFLAGS) $(LFLAGS) -o $@ $^ $(BUILDDIR)/communication.obj: $(SRCDIR)/communication.cc $(HEADERS) @@ -90,6 +90,10 @@ $(BUILDDIR)/script.obj: $(SRCDIR)/script.cc $(HEADERS) @mkdir -p $(@D) $(CC) -c $(CFLAGS) -o $@ $< +$(BUILDDIR)/sending.obj: $(SRCDIR)/sending.cc $(HEADERS) + @mkdir -p $(@D) + $(CC) -c $(CFLAGS) -o $@ $< + $(BUILDDIR)/shm.obj: $(SRCDIR)/shm.cc $(HEADERS) @mkdir -p $(@D) $(CC) -c $(CFLAGS) -o $@ $< diff --git a/TODO.md b/TODO.md index 0c1c72f..19e483f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,5 +1,4 @@ ## TODO NEXT -- SENDING.CC - RECEIVING.CC - QUERY.CC - HOUSES.CC <- GAME diff --git a/reference/game.c b/reference/game.c index 7958431..723efb5 100644 --- a/reference/game.c +++ b/reference/game.c @@ -26728,6570 +26728,6 @@ void __static_initialization_and_destruction_0(int __initialize_p,int __priority return; } - - -bool BeginSendData(TConnection *Connection) - -{ - bool bVar1; - - bVar1 = false; - if (Connection != (TConnection *)0x0) { - bVar1 = false; - if ((Connection->State - CONNECTION_LOGIN < 4) && - (bVar1 = false, Connection->State != CONNECTION_LOGIN)) { - if (Connection->NextToCommit == Connection->NextToSend + 0x4000) { - bVar1 = false; - TConnection::GetSocket(Connection); - print(); - } - else { - Connection->NextToWrite = Connection->NextToCommit; - bVar1 = true; - Connection->Overflow = false; - } - } - } - return bVar1; -} - - - -void FinishSendData(TConnection *Connection) - -{ - if (Connection == (TConnection *)0x0) { - Connection = (TConnection *)s_FinishSendData__Verbindung_ist_N_08108b60; - } - else { - if (Connection->State - CONNECTION_LOGIN < 4) { - if (Connection->Overflow == false) { - Connection->NextToCommit = Connection->NextToWrite; - if (Connection->WillingToSend == false) { - Connection->NextSendingConnection = FirstSendingConnection; - FirstSendingConnection = Connection; - Connection->WillingToSend = true; - } - } - else { - print(); - } - return; - } - Connection = (TConnection *)s_FinishSendData__Verbindung_ist_n_08108b20; - } - error((char *)Connection); - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendAll(void) - -{ - TConnection **ppTVar1; - pid_t __pid; - TConnection *Connection; - TConnection *this; - - this = FirstSendingConnection; - if (FirstSendingConnection != (TConnection *)0x0) { - do { - if (this->WillingToSend == false) { - error("SendAll: Verbindung ist nicht sendewillig.\n"); - } - else { - this->WillingToSend = false; - if ((this->State - CONNECTION_LOGIN < 4) && (this->NextToSend != this->NextToCommit) - ) { - __pid = TConnection::GetPID(this); - kill(__pid,0xc); - } - } - ppTVar1 = &this->NextSendingConnection; - this = *ppTVar1; - } while (*ppTVar1 != (TConnection *)0x0); - } - FirstSendingConnection = (TConnection *)0x0; - return; -} - - - -void SkipFlush(TConnection *Connection) - -{ - int iVar1; - int iVar2; - - if (Skip != -1) { - do { - if (Skip < 0x100) { - iVar1 = Connection->NextToSend; - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar1 + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = (uchar)Skip; - iVar2 = iVar2 + 1; - Connection->NextToWrite = iVar2; - } - else { - Connection->Overflow = true; - } - if (iVar2 < iVar1 + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = 0xff; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - Skip = -1; - } - else { - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = 0xff; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = 0xff; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - Skip = Skip + -0x100; - } - } while (-1 < Skip); - } - return; -} - - - -void SendMapObject(TConnection *Connection,Object *Obj) - -{ - undefined2 uVar1; - ushort uVar2; - bool bVar3; - uchar uVar4; - TPlayer *this; - KNOWNCREATURESTATE KVar5; - int iVar6; - uint uVar7; - TPlayer *pTVar8; - ulong uVar9; - size_t Length; - char *pcVar10; - int iVar11; - uint uVar12; - int iVar13; - char *s; - uint uVar14; - char *__s; - char *pcVar15; - uchar local_74; - uchar local_4c; - uchar local_44 [4]; - int HelpBrightness; - int HelpColor; - Object local_2c [7]; - - bVar3 = Object::exists(Obj); - if (!bVar3) { - pcVar15 = &DAT_08108be0; -LAB_080cc3ff: - error(pcVar15); - return; - } - Object::getObjectType(local_2c); - if (local_2c[0].ObjectID != 99) { - local_2c[0] = (Object)Obj->ObjectID; - Object::getObjectType((Object *)&HelpColor); - bVar3 = ObjectType::getFlag((ObjectType *)&HelpColor,DISGUISE); - if (bVar3) { - Object::getObjectType((Object *)&HelpColor); - uVar9 = ObjectType::getAttribute((ObjectType *)&HelpColor,DISGUISETARGET); - HelpColor._0_2_ = (undefined2)uVar9; - } - else { - Object::getObjectType((Object *)&HelpColor); - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)(undefined2)HelpColor; - uVar12 = iVar6 + 1; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)HelpColor >> 8); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType((Object *)&HelpColor); - bVar3 = ObjectType::getFlag((ObjectType *)&HelpColor,LIQUIDCONTAINER); - if (bVar3) { - uVar9 = Object::getAttribute(Obj,CONTAINERLIQUIDTYPE); - uVar4 = GetLiquidColor(uVar9); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType((Object *)&HelpColor); - bVar3 = ObjectType::getFlag((ObjectType *)&HelpColor,LIQUIDPOOL); - if (bVar3) { - uVar9 = Object::getAttribute(Obj,POOLLIQUIDTYPE); - uVar4 = GetLiquidColor(uVar9); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType((Object *)&HelpColor); - bVar3 = ObjectType::getFlag((ObjectType *)&HelpColor,CUMULATIVE); - if (!bVar3) { - return; - } - uVar9 = Object::getAttribute(Obj,AMOUNT); - iVar6 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar6) { - Connection->Overflow = true; - return; - } - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar9; -LAB_080cce56: - Connection->NextToWrite = iVar6 + 1; - return; - } - local_2c[0] = (Object)Obj->ObjectID; - this = (TPlayer *)GetCreature(local_2c); - if (this == (TPlayer *)0x0) { - pcVar15 = "SendMapObject: Kreatur hat kein Kreatur-Objekt\n"; - goto LAB_080cc3ff; - } - KVar5 = TConnection::KnownCreature(Connection,(this->super_TCreature).ID,true); - if (KVar5 == KNOWNCREATURE_UPTODATE) { - iVar11 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = 'c'; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = '\0'; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - uVar9 = (this->super_TCreature).ID; - if (iVar6 < iVar11 + 0x3ffd) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar9; - uVar12 = iVar6 + 1; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar9 >> 8); - uVar12 = iVar6 + 2; - uVar7 = iVar6 + 0x4001; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar9 >> 0x10); - uVar12 = iVar6 + 3; - uVar7 = iVar6 + 0x4002; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar9 >> 0x18); - iVar6 = iVar6 + 4; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar11 + 0x4000 <= iVar6) { - Connection->Overflow = true; - return; - } - Connection->OutData[iVar6 % 0x4000] = (uchar)(this->super_TCreature).Direction; - goto LAB_080cce56; - } - if (1 < (int)KVar5) { - if (KVar5 != KNOWNCREATURE_OUTDATED) { - return; - } - iVar11 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x4000) { - iVar13 = iVar6 % 0x4000; - iVar6 = iVar6 + 1; - Connection->OutData[iVar13] = 'b'; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = '\0'; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - uVar9 = (this->super_TCreature).ID; - if (iVar6 < iVar11 + 0x3ffd) { - uVar12 = iVar6 + 1; - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar9; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar9 >> 8); - uVar12 = iVar6 + 2; - uVar7 = iVar6 + 0x4001; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar9 >> 0x10); - uVar12 = iVar6 + 3; - uVar7 = iVar6 + 0x4002; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar9 >> 0x18); - Connection->NextToWrite = iVar6 + 4; - } - else { - Connection->Overflow = true; - } - iVar6 = TCreature::GetHealth((TCreature *)this); - uVar4 = (uchar)iVar6; - iVar6 = Connection->NextToSend; - goto LAB_080cc4e9; - } - if (KVar5 != KNOWNCREATURE_FREE) { - return; - } - iVar11 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x4000) { - iVar13 = iVar6 % 0x4000; - iVar6 = iVar6 + 1; - Connection->OutData[iVar13] = 'a'; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = '\0'; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - uVar9 = TConnection::NewKnownCreature(Connection,(this->super_TCreature).ID); - iVar11 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x3ffd) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar9; - uVar12 = iVar6 + 1; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = (char)(uVar9 >> 8); - uVar12 = iVar6 + 2; - uVar7 = iVar6 + 0x4001; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = (char)(uVar9 >> 0x10) - ; - uVar12 = iVar6 + 3; - uVar7 = iVar6 + 0x4002; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - iVar6 = iVar6 + 4; - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = (char)(uVar9 >> 0x18) - ; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - uVar9 = (this->super_TCreature).ID; - if (iVar6 < iVar11 + 0x3ffd) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar9; - uVar12 = iVar6 + 1; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = (char)(uVar9 >> 8); - uVar12 = iVar6 + 2; - uVar7 = iVar6 + 0x4001; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = (char)(uVar9 >> 0x10) - ; - uVar12 = iVar6 + 3; - uVar7 = iVar6 + 0x4002; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = (char)(uVar9 >> 0x18) - ; - Connection->NextToWrite = iVar6 + 4; - } - else { - Connection->Overflow = true; - } - if ((this->super_TCreature).Type == MONSTER) { - pcVar15 = (this->super_TCreature).Name; - pcVar10 = strchr(pcVar15,0x20); - __s = pcVar10 + 1; - if (pcVar10 == (char *)0x0) { - __s = pcVar15; - } - if (__s == (char *)0x0) goto LAB_080ccb5e; - Length = strlen(__s); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - local_4c = (uchar)(Length & 0xffff); - Connection->OutData[iVar6 % 0x4000] = local_4c; - uVar12 = iVar6 + 1; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - local_4c = (uchar)((Length & 0xffff) >> 8); - *(uchar *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = local_4c; - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } -joined_r0x080ccbc6: - if (0 < (int)Length) { - SendText(Connection,__s,Length); - } - } - else { - __s = (this->super_TCreature).Name; - if (__s != (char *)0x0) { - Length = strlen(__s); - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x3fff) { - local_74 = (uchar)(Length & 0xffff); - Connection->OutData[iVar6 % 0x4000] = local_74; - uVar12 = iVar6 + 1; - uVar7 = iVar6 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - local_74 = (uchar)((Length & 0xffff) >> 8); - *(uchar *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = local_74; - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - goto joined_r0x080ccbc6; - } -LAB_080ccb5e: - error("SendString: String ist NULL.\n"); - } - iVar6 = TCreature::GetHealth((TCreature *)this); - uVar4 = (uchar)iVar6; - iVar6 = Connection->NextToSend; -LAB_080cc4e9: - iVar11 = Connection->NextToWrite; - if (iVar11 < iVar6 + 0x4000) { - Connection->OutData[iVar11 % 0x4000] = uVar4; - iVar11 = iVar11 + 1; - Connection->NextToWrite = iVar11; - } - else { - Connection->Overflow = true; - } - if (iVar11 < iVar6 + 0x4000) { - Connection->OutData[iVar11 % 0x4000] = (uchar)(this->super_TCreature).Direction; - iVar11 = iVar11 + 1; - Connection->NextToWrite = iVar11; - } - else { - Connection->Overflow = true; - } - uVar1 = (undefined2)(this->super_TCreature).Outfit.OutfitID; - if (iVar11 < iVar6 + 0x3fff) { - Connection->OutData[iVar11 % 0x4000] = (uchar)uVar1; - uVar12 = iVar11 + 1; - uVar7 = iVar11 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - Connection->NextToWrite = iVar11 + 2; - } - else { - Connection->Overflow = true; - } - if ((this->super_TCreature).Outfit.OutfitID == 0) { - uVar2 = (this->super_TCreature).Outfit.field_1.ObjectType; - iVar11 = Connection->NextToWrite; - if (iVar11 < iVar6 + 0x3fff) { - uVar12 = iVar11 + 1; - Connection->OutData[iVar11 % 0x4000] = (uchar)uVar2; - uVar7 = iVar11 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - *(char *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806) = - (char)(uVar2 >> 8); - Connection->NextToWrite = iVar11 + 2; - } - else { - Connection->Overflow = true; - } - } - else { - SendText(Connection,(char *)(this->super_TCreature).Outfit.field_1.Colors,4); - } - GetCreatureLight((this->super_TCreature).ID,(int *)local_44,&HelpBrightness); - iVar11 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = local_44[0]; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)HelpBrightness; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - uVar7 = TCreature::GetSpeed((TCreature *)this); - iVar6 = Connection->NextToWrite; - iVar11 = Connection->NextToSend; - if (iVar6 < iVar11 + 0x3fff) { - local_74 = (uchar)(uVar7 & 0xffff); - Connection->OutData[iVar6 % 0x4000] = local_74; - uVar14 = iVar6 + 1; - uVar12 = iVar6 + 0x4000; - if (-1 < (int)uVar14) { - uVar12 = uVar14; - } - local_74 = (uchar)((uVar7 & 0xffff) >> 8); - *(uchar *)((int)Connection + (uVar14 - (uVar12 & 0xffffc000)) + 0x806) = local_74; - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - if ((this->super_TCreature).Type == PLAYER) { - pTVar8 = TConnection::GetPlayer(Connection); - iVar6 = TPlayer::GetPlayerkillingMark(this,pTVar8); - uVar4 = (uchar)iVar6; - iVar11 = Connection->NextToSend; - } - else { - uVar4 = '\0'; - } - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - if ((this->super_TCreature).Type == PLAYER) { - pTVar8 = TConnection::GetPlayer(Connection); - iVar6 = TPlayer::GetPartyMark(this,pTVar8); - uVar4 = (uchar)iVar6; - iVar11 = Connection->NextToSend; - } - else { - uVar4 = '\0'; - } - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar11 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendMapPoint(void) - -{ - int Count; - int iVar1; - TConnection *in_stack_00000004; - Object local_4c [4]; - Object local_3c [4]; - ulong local_2c; - Object Obj; - - GetFirstObject(); - local_3c[0].ObjectID = NONE.ObjectID; - if (local_2c != NONE.ObjectID) { - iVar1 = 0; - SkipFlush(in_stack_00000004); - if (local_2c != NONE.ObjectID) { - do { - iVar1 = iVar1 + 1; - local_4c[0].ObjectID = local_2c; - local_3c[0].ObjectID = NONE.ObjectID; - SendMapObject(in_stack_00000004,local_4c); - Object::getNextObject(local_3c); - local_2c = local_3c[0].ObjectID; - if (iVar1 == 10) break; - } while (local_3c[0].ObjectID != NONE.ObjectID); - } - } - Skip = Skip + 1; - return; -} - - - -void SendResult(TConnection *Connection,RESULT r) - -{ - int iVar1; - bool bVar2; - TPlayer *pTVar3; - char *pcVar4; - - if (Connection == (TConnection *)0x0) { - return; - } - switch(r) { - case NOERROR: - Connection = (TConnection *)s_SendResult__NOERROR_08109aa1; - goto LAB_080cd2ea; - case NOTACCESSIBLE: - pcVar4 = "Sorry, not possible."; - break; - case NOTMOVABLE: - pcVar4 = "You cannot move this object."; - break; - case NOTTAKABLE: - pcVar4 = "You cannot take this object."; - break; - case NOROOM: - pcVar4 = "There is not enough room."; - break; - case OUTOFRANGE: - pcVar4 = "Destination is out of range."; - break; - case OUTOFHOME: - Connection = (TConnection *)s_SendResult__OUTOFHOME_08109b3c; - goto LAB_080cd2ea; - case CANNOTTHROW: - pcVar4 = "You cannot throw there."; - break; - case TOOHEAVY: - pcVar4 = "This object is too heavy."; - break; - case CROSSREFERENCE: - pcVar4 = "This is impossible."; - break; - case CONTAINERFULL: - pcVar4 = "You cannot put more objects in this container."; - break; - case WRONGPOSITION: - pcVar4 = "Put this object in your hand."; - break; - case WRONGPOSITION2: - pcVar4 = "Put this object in both hands."; - break; - case WRONGCLOTHES: - pcVar4 = "You cannot dress this object there."; - break; - case HANDSNOTFREE: - pcVar4 = "Both hands have to be free."; - break; - case HANDBLOCKED: - pcVar4 = "Drop the double-handed object first."; - break; - case ONEWEAPONONLY: - pcVar4 = "You may only use one weapon."; - break; - case NOMATCH: - Connection = (TConnection *)s_SendResult__NOMATCH_08109bf0; - goto LAB_080cd2ea; - case NOTCUMULABLE: - Connection = (TConnection *)s_SendResult__NOTCUMULABLE_08109c05; - goto LAB_080cd2ea; - case TOOMANYPARTS: - Connection = (TConnection *)s_SendResult__TOOMANYPARTS_08109c1f; - goto LAB_080cd2ea; - case EMPTYCONTAINER: - Connection = (TConnection *)s_SendResult__EMPTYCONTAINER_08109c39; - goto LAB_080cd2ea; - case SPLITOBJECT: - Connection = (TConnection *)s_SendResult__SPLITOBJECT_08109c55; - goto LAB_080cd2ea; - case NOKEYMATCH: - pcVar4 = "The key does not match."; - break; - case UPSTAIRS: - pcVar4 = "First go upstairs."; - break; - case DOWNSTAIRS: - pcVar4 = "First go downstairs."; - break; - case CREATURENOTEXISTING: - pcVar4 = "A creature with this name does not exist."; - break; - case PLAYERNOTEXISTING: - pcVar4 = "A player with this name does not exist."; - break; - case PLAYERNOTONLINE: - pcVar4 = "A player with this name is not online."; - break; - case NAMEAMBIGUOUS: - pcVar4 = "Playername is ambiguous."; - break; - case NOTUSABLE: - pcVar4 = "You cannot use this object."; - break; - case FEDUP: - pcVar4 = "You are full."; - break; - case SPELLUNKNOWN: - pcVar4 = "You must learn this spell first."; - break; - case LOWMAGICLEVEL: - pcVar4 = "Your magic level is too low."; - break; - case MAGICITEM: - pcVar4 = "A magic item is necessary to cast this spell."; - break; - case NOTENOUGHMANA: - pcVar4 = "You do not have enough mana."; - break; - case NOSKILL: - Connection = (TConnection *)s_SendResult__NOSKILL_08109d2b; - goto LAB_080cd2ea; - case TARGETLOST: - pcVar4 = "Target lost."; - break; - case NOCREATURE: - pcVar4 = "You can only use this rune on creatures."; - break; - case TOOLONG: - Connection = (TConnection *)s_SendResult__TOOLONG_08109d4d; -LAB_080cd2ea: - error((char *)Connection); - return; - case ATTACKNOTALLOWED: - pcVar4 = "You may not attack this person."; - break; - case NOWAY: - pcVar4 = "There is no way."; - break; - case LOGINERROR: - pcVar4 = "An error occured while logging in."; - break; - case PROTECTIONZONE: - pcVar4 = "This action is not permitted in a protection zone."; - break; - case ENTERPROTECTIONZONE: - pcVar4 = "Characters who attacked other players may not enter a protection zone."; - goto LAB_080cd511; - case EXHAUSTED: - pcVar4 = "You are exhausted."; - break; - case NOTINVITED: - pcVar4 = "You are not invited."; - goto LAB_080cd511; - case NOPREMIUMACCOUNT: - pcVar4 = "You need a premium account."; - break; - case MOVENOTPOSSIBLE: - pcVar4 = "Sorry, not possible."; -LAB_080cd511: - SendMessage(Connection,0x17,pcVar4); - bVar2 = BeginSendData(Connection); - if (!bVar2) { - return; - } - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = 0xb5; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - pTVar3 = TConnection::GetPlayer(Connection); - if (pTVar3 == (TPlayer *)0x0) { - return; - } - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = (uchar)(pTVar3->super_TCreature).Direction; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - case ALREADYTRADING: - pcVar4 = "You are already trading. Finish this trade first."; - break; - case PARTNERTRADING: - pcVar4 = "This person is already trading."; - break; - case TOOMANYOBJECTS: - pcVar4 = "You can only trade up to 100 objects at one time."; - break; - case TOOMANYSLAVES: - pcVar4 = "You cannot control more creatures."; - break; - case NOTTURNABLE: - pcVar4 = "You cannot turn this object."; - break; - case SECUREMODE: - pcVar4 = "Turn secure mode off if you really want to attack unmarked players."; - break; - case NOTENOUGHSOULPOINTS: - pcVar4 = "You do not have enough soulpoints."; - break; - case LOWLEVEL: - pcVar4 = "Your level is too low."; - break; - default: - goto switchD_080cd2dc_caseD_ffffffff; - } - SendMessage(Connection,0x17,pcVar4); -switchD_080cd2dc_caseD_ffffffff: - return; -} - - - -// WARNING: Variable defined which should be unmapped: Color - -void SendRefresh(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - int iVar3; - uchar local_18 [4]; - int Brightness; - int Color; - - SendFullScreen(Connection); - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0x82; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - GetAmbiente((int *)local_18,&Brightness); - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = local_18[0]; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)Brightness; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - } - SendPlayerData(Connection); - SendPlayerSkills(Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: id_local - -void __regparm2 SendInitGame(TConnection *Connection,ulong id) - -{ - int iVar1; - undefined2 uVar2; - bool bVar3; - int iVar4; - uint uVar5; - uint uVar6; - TConnection *in_stack_00000004; - ulong in_stack_00000008; - uchar local_14; - ulong id_local; - - bVar3 = BeginSendData(in_stack_00000004); - if (bVar3) { - iVar1 = in_stack_00000004->NextToSend; - iVar4 = in_stack_00000004->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - in_stack_00000004->OutData[iVar4 % 0x4000] = '\n'; - iVar4 = iVar4 + 1; - in_stack_00000004->NextToWrite = iVar4; - } - else { - in_stack_00000004->Overflow = true; - } - if (iVar4 < iVar1 + 0x3ffd) { - uVar6 = iVar4 + 1; - local_14 = (uchar)in_stack_00000008; - in_stack_00000004->OutData[iVar4 % 0x4000] = local_14; - uVar5 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar5 = uVar6; - } - *(char *)((int)in_stack_00000004 + (uVar6 - (uVar5 & 0xffffc000)) + 0x806) = - (char)(in_stack_00000008 >> 8); - uVar6 = iVar4 + 2; - uVar5 = iVar4 + 0x4001; - if (-1 < (int)uVar6) { - uVar5 = uVar6; - } - *(char *)((int)in_stack_00000004 + (uVar6 - (uVar5 & 0xffffc000)) + 0x806) = - (char)(in_stack_00000008 >> 0x10); - uVar6 = iVar4 + 3; - uVar5 = iVar4 + 0x4002; - if (-1 < (int)uVar6) { - uVar5 = uVar6; - } - *(char *)((int)in_stack_00000004 + (uVar6 - (uVar5 & 0xffffc000)) + 0x806) = - (char)(in_stack_00000008 >> 0x18); - iVar4 = iVar4 + 4; - in_stack_00000004->NextToWrite = iVar4; - } - else { - in_stack_00000004->Overflow = true; - } - uVar2 = (undefined2)Beat; - if (iVar4 < iVar1 + 0x3fff) { - uVar6 = iVar4 + 1; - in_stack_00000004->OutData[iVar4 % 0x4000] = (uchar)(undefined2)Beat; - uVar5 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar5 = uVar6; - } - *(char *)((int)in_stack_00000004 + (uVar6 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar2 >> 8); - in_stack_00000004->NextToWrite = iVar4 + 2; - } - else { - in_stack_00000004->Overflow = true; - } - bVar3 = CheckRight(in_stack_00000008,SEND_BUGREPORTS); - iVar4 = in_stack_00000004->NextToWrite; - if (iVar4 < in_stack_00000004->NextToSend + 0x4000) { - in_stack_00000004->OutData[iVar4 % 0x4000] = bVar3; - in_stack_00000004->NextToWrite = iVar4 + 1; - } - else { - in_stack_00000004->Overflow = true; - } - FinishSendData(in_stack_00000004); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Connection_local - -void __regparm2 SendRights(TConnection *Connection) - -{ - bool bVar1; - bool bVar2; - TPlayer *pTVar3; - int Action; - int iVar4; - int Reason; - int Actions; - uint uVar5; - TConnection *in_stack_00000004; - RIGHT local_20; - int Right; - bool SendIt; - TPlayer *pl; - TConnection *Connection_local; - - bVar1 = BeginSendData(in_stack_00000004); - if (bVar1) { - iVar4 = in_stack_00000004->NextToWrite; - if (iVar4 < in_stack_00000004->NextToSend + 0x4000) { - in_stack_00000004->OutData[iVar4 % 0x4000] = '\v'; - in_stack_00000004->NextToWrite = iVar4 + 1; - } - else { - in_stack_00000004->Overflow = true; - } - pTVar3 = TConnection::GetPlayer(in_stack_00000004); - bVar1 = false; - local_20 = NAME_INSULTING; - do { - bVar2 = CheckRight((pTVar3->super_TCreature).ID,local_20); - uVar5 = 0; - if (bVar2) { - iVar4 = 0; - uVar5 = 0; - do { - bVar2 = CheckBanishmentRight - ((pTVar3->super_TCreature).ID,local_20 - NAME_INSULTING,iVar4) - ; - if (bVar2) { - uVar5 = uVar5 | 1 << ((byte)iVar4 & 0x1f); - } - iVar4 = iVar4 + 1; - } while (iVar4 < 7); - if (uVar5 != 0) { - bVar2 = CheckRight((pTVar3->super_TCreature).ID,IP_BANISHMENT); - if (bVar2) { - uVar5 = uVar5 | 0x80; - } - } - } - iVar4 = in_stack_00000004->NextToWrite; - if (iVar4 < in_stack_00000004->NextToSend + 0x4000) { - in_stack_00000004->OutData[iVar4 % 0x4000] = (uchar)uVar5; - in_stack_00000004->NextToWrite = iVar4 + 1; - } - else { - in_stack_00000004->Overflow = true; - } - if (uVar5 != 0) { - bVar1 = true; - } - local_20 = local_20 + NOTATION; - } while ((int)local_20 < 0x32); - if (bVar1) { - FinishSendData(in_stack_00000004); - return; - } - } - return; -} - - - -void SendPing(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = '\x1e'; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: posz - -void SendFullScreen(TConnection *Connection) - -{ - bool bVar1; - int iVar2; - uint uVar3; - uint uVar4; - int y; - int iVar5; - int iVar6; - int z_1; - int z; - int iVar7; - int local_30; - int local_2c; - int x_1; - int x; - int sy; - int sx; - int posx; - int posy; - int posz; - - bVar1 = BeginSendData(Connection); - if (bVar1) { - iVar7 = Connection->NextToWrite; - if (iVar7 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar7 % 0x4000] = 'd'; - Connection->NextToWrite = iVar7 + 1; - } - else { - Connection->Overflow = true; - } - TConnection::GetPosition(Connection,&sx,&posx,&posy); - iVar2 = Connection->NextToSend; - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar2 + 0x3fff) { - Connection->OutData[iVar7 % 0x4000] = (uchar)(undefined2)sx; - uVar4 = iVar7 + 1; - uVar3 = iVar7 + 0x4000; - if (-1 < (int)uVar4) { - uVar3 = uVar4; - } - *(char *)((int)Connection + (uVar4 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)sx >> 8); - iVar7 = iVar7 + 2; - Connection->NextToWrite = iVar7; - } - else { - Connection->Overflow = true; - } - if (iVar7 < iVar2 + 0x3fff) { - uVar4 = iVar7 + 1; - Connection->OutData[iVar7 % 0x4000] = (uchar)(undefined2)posx; - uVar3 = iVar7 + 0x4000; - if (-1 < (int)uVar4) { - uVar3 = uVar4; - } - *(char *)((int)Connection + (uVar4 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)posx >> 8); - iVar7 = iVar7 + 2; - Connection->NextToWrite = iVar7; - } - else { - Connection->Overflow = true; - } - if (iVar7 < iVar2 + 0x4000) { - Connection->OutData[iVar7 % 0x4000] = (uchar)posy; - Connection->NextToWrite = iVar7 + 1; - } - else { - Connection->Overflow = true; - } - Skip = -1; - if (posy < 8) { - iVar7 = 7; - local_30 = Connection->TerminalWidth; - do { - x_1 = 0; - if (0 < local_30) { - iVar2 = Connection->TerminalHeight; - do { - iVar5 = 0; - if (0 < iVar2) { - do { - iVar5 = iVar5 + 1; - SendMapPoint(); - iVar2 = Connection->TerminalHeight; - } while (iVar5 < iVar2); - local_30 = Connection->TerminalWidth; - } - x_1 = x_1 + 1; - } while (x_1 < local_30); - } - iVar7 = iVar7 + -1; - } while (-1 < iVar7); - } - else { - iVar7 = posy + -2; - if ((iVar7 <= posy + 2) && (iVar7 < 0x10)) { - local_30 = Connection->TerminalWidth; - iVar2 = posy; - do { - local_2c = 0; - if (0 < local_30) { - iVar5 = Connection->TerminalHeight; - do { - iVar6 = 0; - if (0 < iVar5) { - do { - iVar6 = iVar6 + 1; - SendMapPoint(); - iVar5 = Connection->TerminalHeight; - } while (iVar6 < iVar5); - local_30 = Connection->TerminalWidth; - iVar2 = posy; - } - local_2c = local_2c + 1; - } while (local_2c < local_30); - } - iVar7 = iVar7 + 1; - } while ((iVar7 <= iVar2 + 2) && (iVar7 < 0x10)); - } - } - SkipFlush(Connection); - FinishSendData(Connection); - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: posz - -void SendRow(TConnection *Connection,int Direction) - -{ - bool bVar1; - int iVar2; - int iVar3; - int z; - int iVar4; - int local_2c; - int end; - int dz; - int sy; - int sx; - int posx; - int posy; - int posz; - - bVar1 = BeginSendData(Connection); - if (!bVar1) { - return; - } - if (Direction == 1) { - iVar4 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar4) goto LAB_080cdfdc; - Connection->OutData[iVar4 % 0x4000] = 'f'; - } - else if (Direction < 2) { - if (Direction != 0) { -LAB_080cdfab: - error(&DAT_08109140,Direction); - return; - } - iVar4 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar4) goto LAB_080cdfdc; - Connection->OutData[iVar4 % 0x4000] = 'e'; - } - else if (Direction == 2) { - iVar4 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar4) { -LAB_080cdfdc: - Connection->Overflow = true; - goto LAB_080cdfe3; - } - Connection->OutData[iVar4 % 0x4000] = 'g'; - } - else { - if (Direction != 3) goto LAB_080cdfab; - iVar4 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar4) goto LAB_080cdfdc; - Connection->OutData[iVar4 % 0x4000] = 'h'; - } - Connection->NextToWrite = iVar4 + 1; -LAB_080cdfe3: - TConnection::GetPosition(Connection,&sx,&posx,&posy); - Skip = -1; - if (posy < 8) { - end = -1; - iVar4 = 7; - local_2c = -1; - } - else { - end = 1; - iVar4 = posy + -2; - local_2c = 0x10; - if (posy + 3 < 0x11) { - local_2c = posy + 3; - } - } - if (Direction == 1) { - if (iVar4 != local_2c) { - iVar2 = Connection->TerminalHeight; - do { - iVar3 = 0; - if (0 < iVar2) { - do { - iVar3 = iVar3 + 1; - SendMapPoint(); - iVar2 = Connection->TerminalHeight; - } while (iVar3 < iVar2); - } - iVar4 = iVar4 + end; - } while (iVar4 != local_2c); - } - } - else if (Direction < 2) { - if ((Direction == 0) && (iVar4 != local_2c)) { - iVar2 = Connection->TerminalWidth; - do { - iVar3 = 0; - if (0 < iVar2) { - do { - iVar3 = iVar3 + 1; - SendMapPoint(); - iVar2 = Connection->TerminalWidth; - } while (iVar3 < iVar2); - } - iVar4 = iVar4 + end; - } while (iVar4 != local_2c); - } - } - else if (Direction == 2) { - if (iVar4 != local_2c) { - iVar2 = Connection->TerminalWidth; - do { - iVar3 = 0; - if (0 < iVar2) { - do { - iVar3 = iVar3 + 1; - SendMapPoint(); - iVar2 = Connection->TerminalWidth; - } while (iVar3 < iVar2); - } - iVar4 = iVar4 + end; - } while (iVar4 != local_2c); - } - } - else if ((Direction == 3) && (iVar4 != local_2c)) { - iVar2 = Connection->TerminalHeight; - do { - iVar3 = 0; - if (0 < iVar2) { - do { - iVar3 = iVar3 + 1; - SendMapPoint(); - iVar2 = Connection->TerminalHeight; - } while (iVar3 < iVar2); - } - iVar4 = iVar4 + end; - } while (iVar4 != local_2c); - } - SkipFlush(Connection); - FinishSendData(Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: posz - -void SendFloors(TConnection *Connection,bool Up) - -{ - bool bVar1; - int iVar2; - int iVar3; - int iVar4; - int z; - int iVar5; - int local_30; - int x; - int sy; - int sx; - int dz; - int end; - int posx; - int posy; - int posz; - - bVar1 = BeginSendData(Connection); - if (!bVar1) { - return; - } - iVar5 = Connection->NextToWrite; - if (iVar5 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar5 % 0x4000] = !Up + 0xbe; - Connection->NextToWrite = iVar5 + 1; - } - else { - Connection->Overflow = true; - } - TConnection::GetPosition(Connection,&end,&posx,&posy); - if (Up) { - if (7 < posy) { - sx = -1; - iVar5 = posy + -2; - dz = posy + -3; - goto LAB_080ce3a4; - } - if (posy != 7) goto LAB_080ce47c; - sx = -1; - iVar5 = 5; - } - else { - if (8 < posy) { - sx = 1; - iVar5 = posy + 2; - dz = posy + 3; - if (0x10 < iVar5) { - iVar5 = 0x10; - } - if (0x10 < dz) { - dz = 0x10; - } - goto LAB_080ce3a4; - } - if (posy == 8) { - sx = 1; - iVar5 = 8; - dz = 0xb; - goto LAB_080ce3a4; - } -LAB_080ce47c: - sx = 0; - iVar5 = -1; - } - dz = -1; -LAB_080ce3a4: - Skip = -1; - if (iVar5 != dz) { - iVar3 = Connection->TerminalWidth; - do { - local_30 = 0; - if (0 < iVar3) { - iVar2 = Connection->TerminalHeight; - do { - iVar4 = 0; - if (0 < iVar2) { - do { - iVar4 = iVar4 + 1; - SendMapPoint(); - iVar2 = Connection->TerminalHeight; - } while (iVar4 < iVar2); - iVar3 = Connection->TerminalWidth; - } - local_30 = local_30 + 1; - } while (local_30 < iVar3); - } - iVar5 = iVar5 + sx; - } while (iVar5 != dz); - } - SkipFlush(Connection); - FinishSendData(Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: x_local - -void __regparm2 SendFieldData(TConnection *Connection,int x,int y,int z) - -{ - int iVar1; - bool bVar2; - uint uVar3; - int iVar4; - uint uVar5; - int iVar6; - undefined4 in_stack_0000000c; - undefined1 in_stack_00000010; - int z_local; - int y_local; - int x_local; - - bVar2 = BeginSendData((TConnection *)y); - if (bVar2) { - iVar1 = *(int *)(y + 0x4808); - iVar4 = *(int *)(y + 0x4810); - if (iVar4 < iVar1 + 0x4000) { - iVar6 = iVar4 % 0x4000; - iVar4 = iVar4 + 1; - *(undefined1 *)(y + 0x806 + iVar6) = 0x69; - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(y + 0x806 + iVar4 % 0x4000) = (char)z; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)(y + 0x806 + (uVar5 - (uVar3 & 0xffffc000))) = (char)((uint)z >> 8); - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(y + 0x806 + iVar4 % 0x4000) = (char)in_stack_0000000c; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)(y + 0x806 + (uVar5 - (uVar3 & 0xffffc000))) = - (char)((uint)in_stack_0000000c >> 8); - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(y + 0x806 + iVar4 % 0x4000) = in_stack_00000010; - *(int *)(y + 0x4810) = iVar4 + 1; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - Skip = -1; - SendMapPoint(); - SkipFlush((TConnection *)y); - FinishSendData((TConnection *)y); - return; - } - return; -} - - - -void SendCloseContainer(TConnection *Connection,int ContNr) - -{ - int iVar1; - bool bVar2; - int iVar3; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 'o'; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)ContNr; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -void SendContainer(TConnection *Connection,int ContNr) - -{ - int iVar1; - bool bVar2; - uchar uVar3; - TPlayer *pl; - TPlayer *Window; - ulong uVar4; - char *__s; - size_t Length; - uint uVar5; - int iVar6; - uint uVar7; - undefined2 uVar8; - int *piVar9; - undefined4 uVar10; - int local_6c; - int Count; - int local_60; - Object local_5c [4]; - Object local_4c [4]; - Object local_3c [4]; - Object local_2c; - Object Obj; - - bVar2 = BeginSendData(Connection); - if (!bVar2) { - return; - } - iVar1 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar1 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = 'n'; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar1 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)ContNr; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - Window = TConnection::GetPlayer(Connection); - if (Window == (TPlayer *)0x0) { - error(&DAT_081091c0); - return; - } - iVar6 = ContNr; - TPlayer::GetOpenContainer((TPlayer *)&local_2c,(int)Window); - bVar2 = Object::exists(&local_2c); - if (!bVar2) { - error("SendContainer: Container %d existiert nicht.\n",ContNr,iVar6); - return; - } - local_3c[0].ObjectID = local_2c.ObjectID; - Object::getObjectType(local_4c); - bVar2 = ObjectType::getFlag((ObjectType *)local_4c,DISGUISE); - if (bVar2) { - Object::getObjectType(local_4c); - uVar4 = ObjectType::getAttribute((ObjectType *)local_4c,DISGUISETARGET); - uVar8 = (undefined2)uVar4; - } - else { - Object::getObjectType(local_4c); - uVar8 = (undefined2)local_4c[0].ObjectID; - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar8; - uVar7 = iVar6 + 1; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar8 >> 8); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType(local_4c); - uVar10 = 0xffffffff; - __s = ObjectType::getName((ObjectType *)local_4c); - if (__s == (char *)0x0) { - error("SendString: String ist NULL.\n",uVar10); - } - else { - Length = strlen(__s); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - Count._0_1_ = (uchar)(Length & 0xffff); - Connection->OutData[iVar6 % 0x4000] = (uchar)Count; - uVar7 = iVar6 + 1; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - Count._0_1_ = (uchar)((Length & 0xffff) >> 8); - *(uchar *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = (uchar)Count; - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,__s,Length); - } - } - Object::getObjectType(local_4c); - uVar4 = ObjectType::getAttribute((ObjectType *)local_4c,CAPACITY); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - Object::getContainer(local_4c); - Object::getObjectType(local_3c); - if ((_func_int_varargs **)local_3c[0].ObjectID != (_func_int_varargs **)0x0) { - Object::getContainer(local_3c); - Object::getObjectType(local_5c); - bVar2 = false; - if ((0 < (int)local_5c[0].ObjectID) && ((int)local_5c[0].ObjectID < 0xb)) { - bVar2 = true; - } - uVar3 = '\x01'; - if (!bVar2) goto LAB_080ce9df; - } - uVar3 = '\0'; -LAB_080ce9df: - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - local_5c[0].ObjectID = local_2c.ObjectID; - local_60 = CountObjectsInContainer(local_5c); - iVar6 = Connection->NextToWrite; - piVar9 = &OBJECTS_PER_CONTAINER; - if (local_60 < 0x25) { - piVar9 = &local_60; - } - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)*piVar9; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - local_6c = 0; - local_3c[0].ObjectID = local_2c.ObjectID; - GetFirstContainerObject(local_4c); - local_2c.ObjectID = local_4c[0].ObjectID; - while( true ) { - bVar2 = false; - local_5c[0].ObjectID = NONE.ObjectID; - local_4c[0].ObjectID = NONE.ObjectID; - if ((local_2c.ObjectID != NONE.ObjectID) && (local_6c < 0x24)) { - bVar2 = true; - } - if (!bVar2) break; - local_5c[0].ObjectID = local_2c.ObjectID; - Object::getObjectType(local_4c); - bVar2 = ObjectType::getFlag((ObjectType *)local_4c,DISGUISE); - if (bVar2) { - Object::getObjectType(local_4c); - uVar4 = ObjectType::getAttribute((ObjectType *)local_4c,DISGUISETARGET); - uVar8 = (undefined2)uVar4; - } - else { - Object::getObjectType(local_4c); - uVar8 = (undefined2)local_4c[0].ObjectID; - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar8; - uVar7 = iVar6 + 1; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar8 >> 8); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType(local_5c); - bVar2 = ObjectType::getFlag((ObjectType *)local_5c,LIQUIDCONTAINER); - if (bVar2) { - uVar4 = Object::getAttribute(&local_2c,CONTAINERLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_5c); - bVar2 = ObjectType::getFlag((ObjectType *)local_5c,LIQUIDPOOL); - if (bVar2) { - uVar4 = Object::getAttribute(&local_2c,POOLLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_5c); - bVar2 = ObjectType::getFlag((ObjectType *)local_5c,CUMULATIVE); - if (bVar2) { - uVar4 = Object::getAttribute(&local_2c,AMOUNT); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getNextObject(local_4c); - local_2c.ObjectID = local_4c[0].ObjectID; - local_6c = local_6c + 1; - } - FinishSendData(Connection); - return; -} - - - -void SendCreateInContainer(TConnection *Connection,int ContNr,Object *Obj) - -{ - int iVar1; - bool bVar2; - uchar uVar3; - ulong uVar4; - uint uVar5; - int iVar6; - uint uVar7; - Object local_3c [4]; - ulong local_2c; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - bVar2 = Object::exists(Obj); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar1 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = 'p'; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar1 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)ContNr; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - local_2c = Obj->ObjectID; - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,DISGUISE); - if (bVar2) { - Object::getObjectType(local_3c); - uVar4 = ObjectType::getAttribute((ObjectType *)local_3c,DISGUISETARGET); - local_3c[0].ObjectID._0_2_ = (undefined2)uVar4; - } - else { - Object::getObjectType(local_3c); - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)(undefined2)local_3c[0].ObjectID; - uVar7 = iVar6 + 1; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)local_3c[0].ObjectID >> 8); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,LIQUIDCONTAINER); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,CONTAINERLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,LIQUIDPOOL); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,POOLLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,CUMULATIVE); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,AMOUNT); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - FinishSendData(Connection); - } - else { - error(&DAT_08109200); - } - } - return; -} - - - -void SendChangeInContainer(TConnection *Connection,int ContNr,Object *Obj) - -{ - int iVar1; - bool bVar2; - uchar uVar3; - int iVar4; - ulong uVar5; - uint uVar6; - int iVar7; - uint uVar8; - uchar local_40; - int RNum; - Object local_2c [7]; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - iVar4 = GetObjectRNum(local_2c); - if (iVar4 < 0x24) { - iVar1 = Connection->NextToSend; - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar1 + 0x4000) { - Connection->OutData[iVar7 % 0x4000] = 'q'; - iVar7 = iVar7 + 1; - Connection->NextToWrite = iVar7; - } - else { - Connection->Overflow = true; - } - if (iVar7 < iVar1 + 0x4000) { - Connection->OutData[iVar7 % 0x4000] = (uchar)ContNr; - iVar7 = iVar7 + 1; - Connection->NextToWrite = iVar7; - } - else { - Connection->Overflow = true; - } - if (iVar7 < iVar1 + 0x4000) { - local_40 = (uchar)iVar4; - Connection->NextToWrite = iVar7 + 1; - Connection->OutData[iVar7 % 0x4000] = local_40; - } - else { - Connection->Overflow = true; - } - local_2c[0] = (Object)Obj->ObjectID; - Object::getObjectType((Object *)&RNum); - bVar2 = ObjectType::getFlag((ObjectType *)&RNum,DISGUISE); - if (bVar2) { - Object::getObjectType((Object *)&RNum); - uVar5 = ObjectType::getAttribute((ObjectType *)&RNum,DISGUISETARGET); - RNum._0_2_ = (undefined2)uVar5; - } - else { - Object::getObjectType((Object *)&RNum); - } - iVar4 = Connection->NextToWrite; - if (iVar4 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(undefined2)RNum; - uVar8 = iVar4 + 1; - uVar6 = iVar4 + 0x4000; - if (-1 < (int)uVar8) { - uVar6 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar6 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)RNum >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType((Object *)&RNum); - bVar2 = ObjectType::getFlag((ObjectType *)&RNum,LIQUIDCONTAINER); - if (bVar2) { - uVar5 = Object::getAttribute(Obj,CONTAINERLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar5); - iVar4 = Connection->NextToWrite; - if (iVar4 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = uVar3; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType((Object *)&RNum); - bVar2 = ObjectType::getFlag((ObjectType *)&RNum,LIQUIDPOOL); - if (bVar2) { - uVar5 = Object::getAttribute(Obj,POOLLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar5); - iVar4 = Connection->NextToWrite; - if (iVar4 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = uVar3; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType((Object *)&RNum); - bVar2 = ObjectType::getFlag((ObjectType *)&RNum,CUMULATIVE); - if (bVar2) { - uVar5 = Object::getAttribute(Obj,AMOUNT); - iVar4 = Connection->NextToWrite; - if (iVar4 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = (uchar)uVar5; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - } - FinishSendData(Connection); - } - } - else { - error(&DAT_08109240); - } - } - return; -} - - - -void SendDeleteInContainer(TConnection *Connection,int ContNr,Object *Obj) - -{ - int iVar1; - bool bVar2; - int iVar3; - int iVar4; - int RNum; - Object local_2c [7]; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - iVar3 = GetObjectRNum(local_2c); - if (iVar3 < 0x24) { - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 'r'; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = (uchar)ContNr; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = (uchar)iVar3; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - } - } - else { - error(&DAT_08109280); - } - } - return; -} - - - -void SendBodyInventory(TConnection *Connection,ulong CreatureID) - -{ - int Position; - int Position_00; - Object local_4c [4]; - ulong local_3c; - ulong local_2c; - Object Obj; - - Position_00 = 1; - do { - GetBodyObject((ulong)&local_2c,CreatureID); - local_3c = NONE.ObjectID; - local_4c[0].ObjectID = NONE.ObjectID; - if (local_2c != NONE.ObjectID) { - local_4c[0].ObjectID = local_2c; - SendSetInventory(Connection,Position_00,local_4c); - } - Position_00 = Position_00 + 1; - } while (Position_00 < 0xb); - return; -} - - - -void SendSetInventory(TConnection *Connection,int Position,Object *Obj) - -{ - int iVar1; - bool bVar2; - uchar uVar3; - ulong uVar4; - uint uVar5; - int iVar6; - uint uVar7; - Object local_3c [4]; - ulong local_2c; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar1 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = 'x'; - iVar6 = iVar6 + 1; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar1 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)Position; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c = Obj->ObjectID; - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,DISGUISE); - if (bVar2) { - Object::getObjectType(local_3c); - uVar4 = ObjectType::getAttribute((ObjectType *)local_3c,DISGUISETARGET); - local_3c[0].ObjectID._0_2_ = (undefined2)uVar4; - } - else { - Object::getObjectType(local_3c); - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)(undefined2)local_3c[0].ObjectID; - uVar7 = iVar6 + 1; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)local_3c[0].ObjectID >> 8); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,LIQUIDCONTAINER); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,CONTAINERLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,LIQUIDPOOL); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,POOLLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = uVar3; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,CUMULATIVE); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,AMOUNT); - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar4; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - } - FinishSendData(Connection); - } - else { - error("SendSetInventory: Objekt existiert nicht.\n"); - } - } - return; -} - - - -void SendDeleteInventory(TConnection *Connection,int Position) - -{ - int iVar1; - bool bVar2; - int iVar3; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 'y'; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)Position; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -void SendTradeObjects(TConnection *Connection,Object *Obj) - -{ - int iVar1; - bool bVar2; - uchar uVar3; - ulong uVar4; - uint uVar5; - uint uVar6; - Object local_4c [4]; - Object local_3c [4]; - Object local_2c [7]; - - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,DISGUISE); - if (bVar2) { - Object::getObjectType(local_3c); - uVar4 = ObjectType::getAttribute((ObjectType *)local_3c,DISGUISETARGET); - local_3c[0].ObjectID._0_2_ = (undefined2)uVar4; - } - else { - Object::getObjectType(local_3c); - } - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar1 % 0x4000] = (uchar)(undefined2)local_3c[0].ObjectID; - uVar6 = iVar1 + 1; - uVar5 = iVar1 + 0x4000; - if (-1 < (int)uVar6) { - uVar5 = uVar6; - } - *(char *)((int)Connection + (uVar6 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)(undefined2)local_3c[0].ObjectID >> 8); - Connection->NextToWrite = iVar1 + 2; - } - else { - Connection->Overflow = true; - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,LIQUIDCONTAINER); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,CONTAINERLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = uVar3; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,LIQUIDPOOL); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,POOLLIQUIDTYPE); - uVar3 = GetLiquidColor(uVar4); - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = uVar3; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,CUMULATIVE); - if (bVar2) { - uVar4 = Object::getAttribute(Obj,AMOUNT); - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = (uchar)uVar4; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - } - Object::getObjectType(local_3c); - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,CONTAINER); - if (bVar2) { - local_4c[0] = (Object)Obj->ObjectID; - GetFirstContainerObject(local_2c); - Obj->ObjectID = (ulong)local_2c[0]; - if (local_2c[0].ObjectID != NONE.ObjectID) { - do { - local_4c[0] = (Object)Obj->ObjectID; - local_3c[0].ObjectID = NONE.ObjectID; - SendTradeObjects(Connection,local_4c); - Object::getNextObject(local_3c); - Obj->ObjectID = (ulong)local_3c[0]; - } while (local_3c[0].ObjectID != NONE.ObjectID); - } - } - } - return; -} - - - -void SendTradeOffer(TConnection *Connection,char *Name,bool OwnOffer,Object *Obj) - -{ - int iVar1; - bool bVar2; - size_t Length; - int iVar3; - uint uVar4; - uint uVar5; - char *Text; - Object local_2c [7]; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = !OwnOffer + '}'; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - if (Name == (char *)0x0) { - Text = "SendTradeOffer: Name ist NULL.\n"; - } - else { - Length = strlen(Name); - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,Name,Length); - } - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - iVar3 = CountObjects(local_2c); - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = (uchar)iVar3; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - local_2c[0] = (Object)Obj->ObjectID; - SendTradeObjects(Connection,local_2c); - FinishSendData(Connection); - return; - } - Text = "SendTradeOffer: Objekt existiert nicht.\n"; - } - error(Text); - } - return; -} - - - -void SendCloseTrade(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = '\x7f'; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -void SendAddField(TConnection *Connection,int x,int y,int z,Object *Obj) - -{ - int iVar1; - bool bVar2; - uint uVar3; - int iVar4; - uint uVar5; - Object local_2c [7]; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 'j'; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)x; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((uint)x >> 8); - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)y; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((uint)y >> 8); - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = (uchar)z; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - SendMapObject(Connection,local_2c); - FinishSendData(Connection); - } - else { - error(&DAT_08109360); - } - } - return; -} - - - -void SendDeleteField(TConnection *Connection,int x,int y,int z,Object *Obj) - -{ - int iVar1; - bool bVar2; - int iVar3; - uint uVar4; - int RNum; - uint uVar5; - Object local_2c [7]; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 'l'; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)x; - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((uint)x >> 8); - iVar3 = iVar3 + 2; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)y; - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((uint)y >> 8); - iVar3 = iVar3 + 2; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)z; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - iVar3 = GetObjectRNum(local_2c); - if (iVar3 < 10) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = (uchar)iVar3; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - } - } - else { - error(&DAT_08109360); - } - } - return; -} - - - -void SendChangeField(TConnection *Connection,int x,int y,int z,Object *Obj) - -{ - int iVar1; - bool bVar2; - int iVar3; - uint uVar4; - int RNum; - uint uVar5; - Object local_2c [7]; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 'k'; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)x; - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((uint)x >> 8); - iVar3 = iVar3 + 2; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)y; - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((uint)y >> 8); - iVar3 = iVar3 + 2; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)z; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - bVar2 = Object::exists(Obj); - if (bVar2) { - local_2c[0] = (Object)Obj->ObjectID; - iVar3 = GetObjectRNum(local_2c); - if (iVar3 < 10) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = (uchar)iVar3; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - local_2c[0] = (Object)Obj->ObjectID; - SendMapObject(Connection,local_2c); - FinishSendData(Connection); - } - } - else { - error(&DAT_081093a0); - } - } - return; -} - - - -void SendMoveCreature(TConnection *Connection,ulong CreatureID,int x,int y,int z) - -{ - undefined2 uVar1; - int iVar2; - bool bVar3; - bool bVar4; - bool bVar5; - TCreature *pTVar6; - int iVar7; - uint uVar8; - int iVar9; - uint uVar10; - TCreature *cr; - uchar uStack_30; - bool DestVisible; - bool StartVisible; - int RNum; - - if (Connection != (TConnection *)0x0) { - pTVar6 = GetCreature(CreatureID); - if (pTVar6 == (TCreature *)0x0) { - error("SendMoveCreature: Kreatur existiert nicht.\n"); - } - else { - RNum = (pTVar6->CrObject).ObjectID; - iVar7 = GetObjectRNum((Object *)&RNum); - bVar3 = false; - bVar4 = TConnection::IsVisible(Connection,pTVar6->posx,pTVar6->posy,pTVar6->posz); - if ((bVar4) && (iVar7 < 10)) { - bVar3 = true; - } - bVar4 = TConnection::IsVisible(Connection,x,y,z); - if (bVar3) { - if (bVar4) { - bVar5 = BeginSendData(Connection); - if (!bVar5) { - return; - } - iVar2 = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < iVar2 + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = 'm'; - iVar9 = iVar9 + 1; - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - uVar1 = (undefined2)pTVar6->posx; - if (iVar9 < iVar2 + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)uVar1; - uVar10 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar10) { - uVar8 = uVar10; - } - *(char *)((int)Connection + (uVar10 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - iVar9 = iVar9 + 2; - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - uVar1 = (undefined2)pTVar6->posy; - if (iVar9 < iVar2 + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)uVar1; - uVar10 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar10) { - uVar8 = uVar10; - } - iVar9 = iVar9 + 2; - *(char *)((int)Connection + (uVar10 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - if (iVar9 < iVar2 + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = (uchar)pTVar6->posz; - iVar9 = iVar9 + 1; - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - if (iVar9 < iVar2 + 0x4000) { - uStack_30 = (uchar)iVar7; - iVar7 = iVar9 % 0x4000; - iVar9 = iVar9 + 1; - Connection->OutData[iVar7] = uStack_30; - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - if (iVar9 < iVar2 + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)x; - uVar10 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar10) { - uVar8 = uVar10; - } - *(char *)((int)Connection + (uVar10 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((uint)x >> 8); - iVar9 = iVar9 + 2; - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - if (iVar9 < iVar2 + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)y; - uVar10 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar10) { - uVar8 = uVar10; - } - iVar9 = iVar9 + 2; - *(char *)((int)Connection + (uVar10 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((uint)y >> 8); - Connection->NextToWrite = iVar9; - } - else { - Connection->Overflow = true; - } - if (iVar9 < iVar2 + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = (uchar)z; - Connection->NextToWrite = iVar9 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - } - if (bVar3) { - if (bVar4) { - return; - } - RNum = (pTVar6->CrObject).ObjectID; - SendDeleteField(Connection,pTVar6->posx,pTVar6->posy,pTVar6->posz, - (Object *)&RNum); - return; - } - } - else if (!bVar4) { - return; - } - if (bVar4) { - RNum = (pTVar6->CrObject).ObjectID; - SendAddField(Connection,x,y,z,(Object *)&RNum); - } - } - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: y_local - -void __regparm2 SendGraphicalEffect(TConnection *Connection,int x,int y,int z,int Type) - -{ - int iVar1; - bool bVar2; - uint uVar3; - int iVar4; - int iVar5; - uint uVar6; - undefined1 in_stack_00000010; - undefined1 in_stack_00000014; - int Type_local; - int z_local; - int y_local; - - bVar2 = BeginSendData((TConnection *)y); - if (bVar2) { - iVar1 = *(int *)(y + 0x4808); - iVar4 = *(int *)(y + 0x4810); - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(y + 0x806 + iVar4 % 0x4000) = 0x83; - iVar4 = iVar4 + 1; - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(y + 0x806 + iVar4 % 0x4000) = (char)(z & 0xffffU); - uVar6 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - iVar4 = iVar4 + 2; - *(char *)(y + 0x806 + (uVar6 - (uVar3 & 0xffffc000))) = (char)((z & 0xffffU) >> 8); - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(y + 0x806 + iVar4 % 0x4000) = (char)Type; - uVar6 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - iVar4 = iVar4 + 2; - *(char *)(y + 0x806 + (uVar6 - (uVar3 & 0xffffc000))) = (char)((uint)Type >> 8); - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - iVar5 = iVar4 % 0x4000; - iVar4 = iVar4 + 1; - *(undefined1 *)(y + 0x806 + iVar5) = in_stack_00000010; - *(int *)(y + 0x4810) = iVar4; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(y + 0x806 + iVar4 % 0x4000) = in_stack_00000014; - *(int *)(y + 0x4810) = iVar4 + 1; - } - else { - *(undefined1 *)(y + 0x4814) = 1; - } - FinishSendData((TConnection *)y); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: z_local -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendTextualEffect(TConnection *Connection,int x,int y,int z,int Color,char *Text) - -{ - int iVar1; - bool bVar2; - size_t Length; - uint uVar3; - int iVar4; - uint uVar5; - char *Text_local; - int Color_local; - int z_local; - - if (Text == (char *)0x0) { - Connection = (TConnection *)s_SendTextualEffect__Text_ist_NULL_08109460; - } - else { - if (*Text != '\0') { - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 0x84; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(x & 0xffffU); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((x & 0xffffU) >> 8); - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3fff) { - uVar5 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)(y & 0xffffU); - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((y & 0xffffU) >> 8); - iVar4 = iVar4 + 2; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Color_local._0_1_ = (uchar)z; - Connection->OutData[iVar4 % 0x4000] = (uchar)Color_local; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Text_local._0_1_ = (uchar)Color; - Connection->OutData[iVar4 % 0x4000] = (uchar)Text_local; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - if (Text == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - Length = strlen(Text); - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,Text,Length); - } - } - FinishSendData(Connection); - return; - } - return; - } - Connection = (TConnection *)s_SendTextualEffect__Text_ist_leer_08109420; - } - error((char *)Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: sy_local - -void __regparm2 -SendMissileEffect(TConnection *Connection,int sx,int sy,int sz,int zx,int zy,int zz,int Type) - -{ - int iVar1; - bool bVar2; - uint uVar3; - int iVar4; - int iVar5; - uint uVar6; - undefined1 in_stack_0000001c; - undefined1 in_stack_00000020; - int Type_local; - int zz_local; - int zy_local; - int zx_local; - int sz_local; - int sy_local; - - bVar2 = BeginSendData((TConnection *)sy); - if (bVar2) { - iVar1 = *(int *)(sy + 0x4808); - iVar4 = *(int *)(sy + 0x4810); - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(sy + 0x806 + iVar4 % 0x4000) = 0x85; - iVar4 = iVar4 + 1; - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(sy + 0x806 + iVar4 % 0x4000) = (char)(sz & 0xffffU); - uVar6 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - iVar4 = iVar4 + 2; - *(char *)(sy + 0x806 + (uVar6 - (uVar3 & 0xffffc000))) = (char)((sz & 0xffffU) >> 8); - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(sy + 0x806 + iVar4 % 0x4000) = (char)zx; - uVar6 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - iVar4 = iVar4 + 2; - *(char *)(sy + 0x806 + (uVar6 - (uVar3 & 0xffffc000))) = (char)((uint)zx >> 8); - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - zx_local._0_1_ = (undefined1)zy; - iVar5 = iVar4 % 0x4000; - iVar4 = iVar4 + 1; - *(undefined1 *)(sy + 0x806 + iVar5) = (undefined1)zx_local; - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(sy + 0x806 + iVar4 % 0x4000) = (char)zz; - uVar6 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - iVar4 = iVar4 + 2; - *(char *)(sy + 0x806 + (uVar6 - (uVar3 & 0xffffc000))) = (char)((uint)zz >> 8); - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3fff) { - *(char *)(sy + 0x806 + iVar4 % 0x4000) = (char)Type; - uVar6 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - iVar4 = iVar4 + 2; - *(char *)(sy + 0x806 + (uVar6 - (uVar3 & 0xffffc000))) = (char)((uint)Type >> 8); - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - iVar5 = iVar4 % 0x4000; - iVar4 = iVar4 + 1; - *(undefined1 *)(sy + 0x806 + iVar5) = in_stack_0000001c; - *(int *)(sy + 0x4810) = iVar4; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(sy + 0x806 + iVar4 % 0x4000) = in_stack_00000020; - *(int *)(sy + 0x4810) = iVar4 + 1; - } - else { - *(undefined1 *)(sy + 0x4814) = 1; - } - FinishSendData((TConnection *)sy); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Color_local - -void __regparm2 SendMarkCreature(TConnection *Connection,ulong CreatureID,int Color) - -{ - int iVar1; - bool bVar2; - uint uVar3; - int iVar4; - uint uVar5; - undefined4 in_stack_00000008; - undefined1 in_stack_0000000c; - int Color_local; - - bVar2 = BeginSendData((TConnection *)Color); - if (bVar2) { - iVar1 = *(int *)(Color + 0x4808); - iVar4 = *(int *)(Color + 0x4810); - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(Color + 0x806 + iVar4 % 0x4000) = 0x86; - iVar4 = iVar4 + 1; - *(int *)(Color + 0x4810) = iVar4; - } - else { - *(undefined1 *)(Color + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x3ffd) { - *(char *)(Color + 0x806 + iVar4 % 0x4000) = (char)in_stack_00000008; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)(Color + 0x806 + (uVar5 - (uVar3 & 0xffffc000))) = - (char)((uint)in_stack_00000008 >> 8); - uVar5 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)(Color + 0x806 + (uVar5 - (uVar3 & 0xffffc000))) = - (char)((uint)in_stack_00000008 >> 0x10); - uVar5 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 4; - *(char *)(Color + 0x806 + (uVar5 - (uVar3 & 0xffffc000))) = - (char)((uint)in_stack_00000008 >> 0x18); - *(int *)(Color + 0x4810) = iVar4; - } - else { - *(undefined1 *)(Color + 0x4814) = 1; - } - if (iVar4 < iVar1 + 0x4000) { - *(undefined1 *)(Color + 0x806 + iVar4 % 0x4000) = in_stack_0000000c; - *(int *)(Color + 0x4810) = iVar4 + 1; - } - else { - *(undefined1 *)(Color + 0x4814) = 1; - } - FinishSendData((TConnection *)Color); - return; - } - return; -} - - - -void SendEditText(TConnection *Connection,Object *Obj) - -{ - Object *this; - bool bVar1; - TPlayer *pl; - ulong uVar2; - size_t sVar3; - uint uVar4; - TPlayer *pTVar5; - int iVar6; - int iVar7; - uint uVar8; - ushort *puVar9; - char *Text_00; - uchar local_1060; - char *local_1048; - char *Editor; - char *Text; - ushort MaxLen; - char Buffer [4096]; - - bVar1 = BeginSendData(Connection); - if (!bVar1) { - return; - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = 0x96; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - bVar1 = Object::exists(Obj); - if (!bVar1) { - Text_00 = &DAT_081094e0; -LAB_080d1c40: - error(Text_00); - return; - } - uVar2 = Obj->ObjectID; - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3ffd) { - uVar8 = iVar6 + 1; - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar2; - uVar4 = iVar6 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = (char)(uVar2 >> 8); - uVar8 = iVar6 + 2; - uVar4 = iVar6 + 0x4001; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = (char)(uVar2 >> 0x10); - uVar8 = iVar6 + 3; - uVar4 = iVar6 + 0x4002; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = (char)(uVar2 >> 0x18); - Connection->NextToWrite = iVar6 + 4; - } - else { - Connection->Overflow = true; - } - this = (Object *)(Buffer + 0xffc); - Object::getObjectType(this); - bVar1 = ObjectType::getFlag((ObjectType *)this,DISGUISE); - if (bVar1) { - Object::getObjectType(this); - uVar2 = ObjectType::getAttribute((ObjectType *)this,DISGUISETARGET); - Buffer._4092_2_ = (undefined2)uVar2; - } - else { - Object::getObjectType(this); - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x3fff) { - uVar8 = iVar6 + 1; - Connection->OutData[iVar6 % 0x4000] = (uchar)Buffer._4092_2_; - uVar4 = iVar6 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = - SUB21(Buffer._4092_2_,1); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - Editor = (char *)&MaxLen; - puVar9 = &MaxLen; - for (iVar6 = 0x400; iVar6 != 0; iVar6 = iVar6 + -1) { - puVar9[0] = 0; - puVar9[1] = 0; - puVar9 = puVar9 + 2; - } - Object::getObjectType(this); - bVar1 = ObjectType::getFlag((ObjectType *)this,WRITE); - if (bVar1) { -LAB_080d171d: - Object::getObjectType(this); - bVar1 = ObjectType::getFlag((ObjectType *)this,WRITE); - Object::getObjectType(this); - uVar2 = ObjectType::getAttribute((ObjectType *)this,!bVar1 + MAXLENGTH); - Text._0_2_ = (short)uVar2 + -1; - uVar2 = Object::getAttribute(Obj,TEXTSTRING); - Editor = GetDynamicString(uVar2); - uVar2 = Object::getAttribute(Obj,EDITOR); - local_1048 = GetDynamicString(uVar2); - } - else { - Object::getObjectType(this); - bVar1 = ObjectType::getFlag((ObjectType *)this,WRITEONCE); - if (bVar1) goto LAB_080d171d; - Object::getObjectType(this); - bVar1 = ObjectType::getFlag((ObjectType *)this,INFORMATION); - if (bVar1) { - Object::getObjectType(this); - uVar2 = ObjectType::getAttribute((ObjectType *)this,INFORMATIONTYPE); - if (uVar2 != 4) goto LAB_080d1b88; - pTVar5 = TConnection::GetPlayer(Connection); - if (pTVar5 == (TPlayer *)0x0) { - Text_00 = &DAT_081094a0; - goto LAB_080d1c40; - } - GetSpellbook((pTVar5->super_TCreature).ID,Editor); - local_1048 = (char *)0x0; - sVar3 = strlen(Editor); - Text._0_2_ = (short)sVar3; - } - else { -LAB_080d1b88: - uVar2 = Object::getAttribute(Obj,TEXTSTRING); - Editor = GetDynamicString(uVar2); - uVar2 = Object::getAttribute(Obj,EDITOR); - local_1048 = GetDynamicString(uVar2); - Text._0_2_ = 0; - if (Editor != (char *)0x0) { - sVar3 = strlen(Editor); - Text._0_2_ = (short)sVar3; - } - } - } - iVar6 = Connection->NextToSend; - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar6 + 0x3fff) { - Connection->OutData[iVar7 % 0x4000] = (uchar)Text; - uVar8 = iVar7 + 1; - uVar4 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((ushort)(short)Text >> 8); - Connection->NextToWrite = iVar7 + 2; - } - else { - Connection->Overflow = true; - } - if (Editor != (char *)0x0) { - if ((short)Text != 0) { - sVar3 = strlen(Editor); - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar6 + 0x3fff) { - local_1060 = (uchar)(sVar3 & 0xffff); - Connection->OutData[iVar7 % 0x4000] = local_1060; - uVar8 = iVar7 + 1; - uVar4 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - local_1060 = (uchar)((sVar3 & 0xffff) >> 8); - *(uchar *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = local_1060; - Connection->NextToWrite = iVar7 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar3) { - SendText(Connection,Editor,sVar3); - iVar6 = Connection->NextToSend; - } - if (local_1048 == (char *)0x0) { - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar6 + 0x3fff) { - uVar8 = iVar7 + 1; - uVar4 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - Connection->OutData[iVar7 % 0x4000] = '\0'; - *(undefined1 *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = 0; - Connection->NextToWrite = iVar7 + 2; - } - else { - Connection->Overflow = true; - } - } - else { - sVar3 = strlen(local_1048); - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar6 + 0x3fff) { - Connection->OutData[iVar7 % 0x4000] = (uchar)(sVar3 & 0xffff); - uVar8 = iVar7 + 1; - uVar4 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((sVar3 & 0xffff) >> 8); - Connection->NextToWrite = iVar7 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar3) { - SendText(Connection,local_1048,sVar3); - } - } - } - if (Editor == (char *)0x0) { - iVar6 = Connection->NextToSend; - } - else { - if ((short)Text != 0) goto LAB_080d1904; - iVar6 = Connection->NextToSend; - } - } - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar6 + 0x3fff) { - Connection->OutData[iVar7 % 0x4000] = '\0'; - uVar8 = iVar7 + 1; - uVar4 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = 0; - iVar7 = iVar7 + 2; - Connection->NextToWrite = iVar7; - } - else { - Connection->Overflow = true; - } - if (iVar7 < iVar6 + 0x3fff) { - Connection->OutData[iVar7 % 0x4000] = '\0'; - uVar8 = iVar7 + 1; - uVar4 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar4 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar4 & 0xffffc000)) + 0x806) = 0; - Connection->NextToWrite = iVar7 + 2; - } - else { - Connection->Overflow = true; - } -LAB_080d1904: - FinishSendData(Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: Type_local -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendEditList(TConnection *Connection,uchar Type,ulong ID,char *Text) - -{ - int iVar1; - bool bVar2; - size_t Length; - uint uVar3; - int iVar4; - uint uVar5; - char *Text_local; - uchar Type_local; - - bVar2 = BeginSendData(Connection); - if (!bVar2) { - return; - } - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 0x97; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = Type; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3ffd) { - uVar5 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)ID; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = (char)(ID >> 8); - uVar5 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = (char)(ID >> 0x10); - uVar5 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = (char)(ID >> 0x18); - Connection->NextToWrite = iVar4 + 4; - } - else { - Connection->Overflow = true; - } - Length = strlen(Text); - if (Length < 0xfa1) { - if (Text == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,Text,Length); - } - } - FinishSendData(Connection); - return; - } - error("SendEditList: Text ist zu lang.\n"); - return; -} - - - -// WARNING: Variable defined which should be unmapped: Color - -void SendAmbiente(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - int iVar3; - uchar local_18 [4]; - int Brightness; - int Color; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0x82; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - GetAmbiente((int *)local_18,&Brightness); - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = local_18[0]; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)Brightness; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - } - return; -} - - - -void SendCreatureHealth(TConnection *Connection,ulong CreatureID) - -{ - bool bVar1; - TCreature *cr; - TCreature *this; - int iVar2; - int iVar3; - uint uVar4; - uint uVar5; - - bVar1 = BeginSendData(Connection); - if (!bVar1) { - return; - } - iVar2 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar2 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0x8c; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar2 + 0x3ffd) { - uVar5 = iVar3 + 1; - Connection->OutData[iVar3 % 0x4000] = (uchar)CreatureID; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 8); - uVar5 = iVar3 + 2; - uVar4 = iVar3 + 0x4001; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x10); - uVar5 = iVar3 + 3; - uVar4 = iVar3 + 0x4002; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x18); - Connection->NextToWrite = iVar3 + 4; - } - else { - Connection->Overflow = true; - } - this = GetCreature(CreatureID); - if (this != (TCreature *)0x0) { - iVar2 = TCreature::GetHealth(this); - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)iVar2; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - error("SendCreatureHealth: Kreatur %ld existiert nicht.\n"); - return; -} - - - -// WARNING: Variable defined which should be unmapped: HelpColor - -void SendCreatureLight(TConnection *Connection,ulong CreatureID) - -{ - int iVar1; - bool bVar2; - TCreature *pTVar3; - int iVar4; - TCreature *cr; - uint uVar5; - int iVar6; - uint uVar7; - uchar local_18 [4]; - int HelpBrightness; - int HelpColor; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 0x8d; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3ffd) { - uVar7 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)CreatureID; - uVar5 = iVar4 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 8); - uVar7 = iVar4 + 2; - uVar5 = iVar4 + 0x4001; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x10); - uVar7 = iVar4 + 3; - uVar5 = iVar4 + 0x4002; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x18); - Connection->NextToWrite = iVar4 + 4; - } - else { - Connection->Overflow = true; - } - pTVar3 = GetCreature(CreatureID); - if (pTVar3 == (TCreature *)0x0) { - error("SendCreatureLight: Kreatur %ld existiert nicht.\n",CreatureID); - } - else { - GetCreatureLight(pTVar3->ID,(int *)local_18,&HelpBrightness); - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - iVar6 = iVar4 % 0x4000; - iVar4 = iVar4 + 1; - Connection->OutData[iVar6] = local_18[0]; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = (uchar)HelpBrightness; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - } - } - return; -} - - - -void SendCreatureOutfit(TConnection *Connection,ulong CreatureID) - -{ - undefined2 uVar1; - ushort uVar2; - int iVar3; - bool bVar4; - TCreature *pTVar5; - uint uVar6; - int iVar7; - TCreature *cr; - uint uVar8; - - bVar4 = BeginSendData(Connection); - if (!bVar4) { - return; - } - iVar3 = Connection->NextToSend; - iVar7 = Connection->NextToWrite; - if (iVar7 < iVar3 + 0x4000) { - Connection->OutData[iVar7 % 0x4000] = 0x8e; - iVar7 = iVar7 + 1; - Connection->NextToWrite = iVar7; - } - else { - Connection->Overflow = true; - } - if (iVar7 < iVar3 + 0x3ffd) { - uVar8 = iVar7 + 1; - Connection->OutData[iVar7 % 0x4000] = (uchar)CreatureID; - uVar6 = iVar7 + 0x4000; - if (-1 < (int)uVar8) { - uVar6 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar6 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 8); - uVar8 = iVar7 + 2; - uVar6 = iVar7 + 0x4001; - if (-1 < (int)uVar8) { - uVar6 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar6 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x10); - uVar8 = iVar7 + 3; - uVar6 = iVar7 + 0x4002; - if (-1 < (int)uVar8) { - uVar6 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar6 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x18); - Connection->NextToWrite = iVar7 + 4; - } - else { - Connection->Overflow = true; - } - pTVar5 = GetCreature(CreatureID); - if (pTVar5 != (TCreature *)0x0) { - uVar1 = (undefined2)(pTVar5->Outfit).OutfitID; - iVar7 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar7 + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)uVar1; - uVar8 = iVar3 + 1; - uVar6 = iVar3 + 0x4000; - if (-1 < (int)uVar8) { - uVar6 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar6 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - if ((pTVar5->Outfit).OutfitID == 0) { - uVar2 = (pTVar5->Outfit).field_1.ObjectType; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar7 + 0x3fff) { - uVar8 = iVar3 + 1; - Connection->OutData[iVar3 % 0x4000] = (uchar)uVar2; - uVar6 = iVar3 + 0x4000; - if (-1 < (int)uVar8) { - uVar6 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar6 & 0xffffc000)) + 0x806) = - (char)(uVar2 >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - } - else { - SendText(Connection,(char *)(pTVar5->Outfit).field_1.Colors,4); - } - FinishSendData(Connection); - return; - } - error("SendCreatureOutfit: Kreatur %ld existiert nicht.\n"); - return; -} - - - -void SendCreatureSpeed(TConnection *Connection,ulong CreatureID) - -{ - int iVar1; - bool bVar2; - TCreature *cr; - TCreature *this; - uint uVar3; - int iVar4; - uint uVar5; - uint uVar6; - - bVar2 = BeginSendData(Connection); - if (!bVar2) { - return; - } - iVar1 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < iVar1 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 0x8f; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < iVar1 + 0x3ffd) { - uVar6 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)CreatureID; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - *(char *)((int)Connection + (uVar6 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 8); - uVar6 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - *(char *)((int)Connection + (uVar6 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x10); - uVar6 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar6) { - uVar3 = uVar6; - } - *(char *)((int)Connection + (uVar6 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x18); - Connection->NextToWrite = iVar4 + 4; - } - else { - Connection->Overflow = true; - } - this = GetCreature(CreatureID); - if (this != (TCreature *)0x0) { - uVar3 = TCreature::GetSpeed(this); - iVar4 = Connection->NextToWrite; - if (iVar4 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(uVar3 & 0xffff); - uVar5 = iVar4 + 1; - uVar6 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar6 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar6 & 0xffffc000)) + 0x806) = - (char)((uVar3 & 0xffff) >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - error("SendCreatureSpeed: Kreatur %ld existiert nicht.\n"); - return; -} - - - -void SendCreatureSkull(TConnection *Connection,ulong CreatureID) - -{ - bool bVar1; - TPlayer *this; - TPlayer *Observer; - int iVar2; - int iVar3; - uint uVar4; - TPlayer *pl; - uint uVar5; - - bVar1 = BeginSendData(Connection); - if (!bVar1) { - return; - } - iVar2 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar2 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0x90; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar2 + 0x3ffd) { - uVar5 = iVar3 + 1; - Connection->OutData[iVar3 % 0x4000] = (uchar)CreatureID; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 8); - uVar5 = iVar3 + 2; - uVar4 = iVar3 + 0x4001; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x10); - uVar5 = iVar3 + 3; - uVar4 = iVar3 + 0x4002; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x18); - Connection->NextToWrite = iVar3 + 4; - } - else { - Connection->Overflow = true; - } - this = GetPlayer(CreatureID); - if (this != (TPlayer *)0x0) { - Observer = TConnection::GetPlayer(Connection); - iVar2 = TPlayer::GetPlayerkillingMark(this,Observer); - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)iVar2; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - error("SendCreatureSkull: Kreatur %ld existiert nicht.\n"); - return; -} - - - -void SendCreatureParty(TConnection *Connection,ulong CreatureID) - -{ - bool bVar1; - TPlayer *this; - TPlayer *Observer; - int iVar2; - int iVar3; - uint uVar4; - TPlayer *pl; - uint uVar5; - - bVar1 = BeginSendData(Connection); - if (!bVar1) { - return; - } - iVar2 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar2 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0x91; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar2 + 0x3ffd) { - uVar5 = iVar3 + 1; - Connection->OutData[iVar3 % 0x4000] = (uchar)CreatureID; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 8); - uVar5 = iVar3 + 2; - uVar4 = iVar3 + 0x4001; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x10); - uVar5 = iVar3 + 3; - uVar4 = iVar3 + 0x4002; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)(CreatureID >> 0x18); - Connection->NextToWrite = iVar3 + 4; - } - else { - Connection->Overflow = true; - } - this = GetPlayer(CreatureID); - if (this != (TPlayer *)0x0) { - Observer = TConnection::GetPlayer(Connection); - iVar2 = TPlayer::GetPartyMark(this,Observer); - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = (uchar)iVar2; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - error("SendCreatureParty: Kreatur %ld existiert nicht.\n"); - return; -} - - - -void SendClearTarget(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = 0xa3; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: pl - -void SendPlayerData(TConnection *Connection) - -{ - undefined2 uVar1; - TSkill *pTVar2; - bool bVar3; - TPlayer *pTVar4; - uint uVar5; - int iVar6; - uint uVar7; - TSkill *sk; - int Capacity; - uint uVar8; - int iVar9; - int local_1c; - TPlayer *pl; - - bVar3 = BeginSendData(Connection); - if (!bVar3) { - return; - } - iVar9 = Connection->NextToWrite; - if (iVar9 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = 0xa0; - Connection->NextToWrite = iVar9 + 1; - } - else { - Connection->Overflow = true; - } - pTVar4 = TConnection::GetPlayer(Connection); - if (pTVar4 == (TPlayer *)0x0) { - error(&DAT_081096e0); - return; - } - pTVar2 = (pTVar4->super_TCreature).super_TSkillBase.Skills[2]; - if (pTVar2 == (TSkill *)0x0) { - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (local_1c + 0x3fff <= iVar9) goto LAB_080d3570; - Connection->OutData[iVar9 % 0x4000] = '\0'; - uVar8 = iVar9 + 1; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; -LAB_080d2d93: - iVar9 = iVar9 + 2; - Connection->NextToWrite = iVar9; - } - else { - uVar5 = TSkill::Get(pTVar2); - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < local_1c + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)(uVar5 & 0xffff); - uVar7 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar7) { - uVar8 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((uVar5 & 0xffff) >> 8); - goto LAB_080d2d93; - } -LAB_080d3570: - Connection->Overflow = true; - } - if (pTVar2 == (TSkill *)0x0) { - if (local_1c + 0x3fff <= iVar9) goto LAB_080d3510; - Connection->OutData[iVar9 % 0x4000] = '\0'; - uVar8 = iVar9 + 1; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; -LAB_080d2df5: - Connection->NextToWrite = iVar9 + 2; - } - else { - uVar1 = (undefined2)pTVar2->Max; - if (iVar9 < local_1c + 0x3fff) { - uVar8 = iVar9 + 1; - Connection->OutData[iVar9 % 0x4000] = (uchar)uVar1; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - goto LAB_080d2df5; - } -LAB_080d3510: - Connection->Overflow = true; - } - iVar9 = 0; - pTVar2 = (pTVar4->super_TCreature).super_TSkillBase.Skills[5]; - if (pTVar2 != (TSkill *)0x0) { - iVar6 = TSkill::Get(pTVar2); - iVar9 = GetInventoryWeight((pTVar4->super_TCreature).ID); - iVar9 = iVar6 * 100 - iVar9; - } - if (iVar9 < 0) { - iVar9 = 0; - } - bVar3 = CheckRight((pTVar4->super_TCreature).ID,ZERO_CAPACITY); - if (bVar3) { - iVar9 = 0; - } - local_1c = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - uVar5 = iVar9 / 100 & 0xffff; - if (iVar6 < local_1c + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)uVar5; - uVar7 = iVar6 + 1; - uVar8 = iVar6 + 0x4000; - if (-1 < (int)uVar7) { - uVar8 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar8 & 0xffffc000)) + 0x806) = (char)(uVar5 >> 8); - iVar6 = iVar6 + 2; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - pTVar2 = (pTVar4->super_TCreature).super_TSkillBase.Skills[0]; - if (pTVar2 == (TSkill *)0x0) { - if (local_1c + 0x3ffd <= iVar6) goto LAB_080d3425; - uVar8 = iVar6 + 1; - Connection->OutData[iVar6 % 0x4000] = '\0'; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; - uVar8 = iVar6 + 2; - uVar5 = iVar6 + 0x4001; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; - uVar8 = iVar6 + 3; - uVar5 = iVar6 + 0x4002; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; -LAB_080d2f38: - Connection->NextToWrite = iVar6 + 4; - } - else { - iVar9 = pTVar2->Exp; - if (iVar6 < local_1c + 0x3ffd) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar9; - uVar8 = iVar6 + 1; - uVar5 = iVar6 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((uint)iVar9 >> 8); - uVar8 = iVar6 + 2; - uVar5 = iVar6 + 0x4001; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((uint)iVar9 >> 0x10); - uVar8 = iVar6 + 3; - uVar5 = iVar6 + 0x4002; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((uint)iVar9 >> 0x18); - goto LAB_080d2f38; - } -LAB_080d3425: - Connection->Overflow = true; - } - if (pTVar2 == (TSkill *)0x0) { - iVar9 = Connection->NextToWrite; - if (local_1c + 0x3fff <= iVar9) goto LAB_080d33c6; - uVar8 = iVar9 + 1; - Connection->OutData[iVar9 % 0x4000] = '\0'; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; -LAB_080d2fb2: - Connection->NextToWrite = iVar9 + 2; - } - else { - uVar5 = TSkill::Get(pTVar2); - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < local_1c + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)(uVar5 & 0xffff); - uVar7 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar7) { - uVar8 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((uVar5 & 0xffff) >> 8); - goto LAB_080d2fb2; - } -LAB_080d33c6: - Connection->Overflow = true; - } - if (pTVar2 == (TSkill *)0x0) { - iVar9 = Connection->NextToWrite; - if (local_1c + 0x4000 <= iVar9) goto LAB_080d3383; - Connection->OutData[iVar9 % 0x4000] = '\0'; -LAB_080d3009: - Connection->NextToWrite = iVar9 + 1; - } - else { - iVar6 = TSkill::GetProgress(pTVar2); - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < local_1c + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = (uchar)iVar6; - goto LAB_080d3009; - } -LAB_080d3383: - Connection->Overflow = true; - } - pTVar2 = (pTVar4->super_TCreature).super_TSkillBase.Skills[3]; - if (pTVar2 == (TSkill *)0x0) { - iVar9 = Connection->NextToWrite; - if (local_1c + 0x3fff <= iVar9) goto LAB_080d3321; - uVar8 = iVar9 + 1; - Connection->OutData[iVar9 % 0x4000] = '\0'; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; -LAB_080d3086: - iVar9 = iVar9 + 2; - Connection->NextToWrite = iVar9; - } - else { - uVar5 = TSkill::Get(pTVar2); - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < local_1c + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)(uVar5 & 0xffff); - uVar7 = iVar9 + 1; - uVar8 = iVar9 + 0x4000; - if (-1 < (int)uVar7) { - uVar8 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar8 & 0xffffc000)) + 0x806) = - (char)((uVar5 & 0xffff) >> 8); - goto LAB_080d3086; - } -LAB_080d3321: - Connection->Overflow = true; - } - if (pTVar2 == (TSkill *)0x0) { - if (local_1c + 0x3fff <= iVar9) goto LAB_080d32c8; - uVar8 = iVar9 + 1; - Connection->OutData[iVar9 % 0x4000] = '\0'; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(undefined1 *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = 0; -LAB_080d30e8: - Connection->NextToWrite = iVar9 + 2; - } - else { - uVar1 = (undefined2)pTVar2->Max; - if (iVar9 < local_1c + 0x3fff) { - Connection->OutData[iVar9 % 0x4000] = (uchar)uVar1; - uVar8 = iVar9 + 1; - uVar5 = iVar9 + 0x4000; - if (-1 < (int)uVar8) { - uVar5 = uVar8; - } - *(char *)((int)Connection + (uVar8 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - goto LAB_080d30e8; - } -LAB_080d32c8: - Connection->Overflow = true; - } - pTVar2 = (pTVar4->super_TCreature).super_TSkillBase.Skills[1]; - if (pTVar2 == (TSkill *)0x0) { - iVar9 = Connection->NextToWrite; - if (local_1c + 0x4000 <= iVar9) goto LAB_080d3286; - Connection->OutData[iVar9 % 0x4000] = '\0'; -LAB_080d3143: - Connection->NextToWrite = iVar9 + 1; - } - else { - iVar6 = TSkill::Get(pTVar2); - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < local_1c + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = (uchar)iVar6; - goto LAB_080d3143; - } -LAB_080d3286: - Connection->Overflow = true; - } - if (pTVar2 == (TSkill *)0x0) { - iVar9 = Connection->NextToWrite; - if (local_1c + 0x4000 <= iVar9) goto LAB_080d3243; - Connection->OutData[iVar9 % 0x4000] = '\0'; -LAB_080d319a: - Connection->NextToWrite = iVar9 + 1; - } - else { - iVar6 = TSkill::GetProgress(pTVar2); - local_1c = Connection->NextToSend; - iVar9 = Connection->NextToWrite; - if (iVar9 < local_1c + 0x4000) { - Connection->OutData[iVar9 % 0x4000] = (uchar)iVar6; - goto LAB_080d319a; - } -LAB_080d3243: - Connection->Overflow = true; - } - pTVar2 = (pTVar4->super_TCreature).super_TSkillBase.Skills[0x16]; - if (pTVar2 == (TSkill *)0x0) { - iVar9 = Connection->NextToWrite; - if (local_1c + 0x4000 <= iVar9) goto LAB_080d3201; - Connection->OutData[iVar9 % 0x4000] = '\0'; - } - else { - iVar6 = TSkill::Get(pTVar2); - iVar9 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar9) { -LAB_080d3201: - Connection->Overflow = true; - goto LAB_080d31f2; - } - Connection->OutData[iVar9 % 0x4000] = (uchar)iVar6; - } - Connection->NextToWrite = iVar9 + 1; -LAB_080d31f2: - FinishSendData(Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: pl - -void SendPlayerSkills(TConnection *Connection) - -{ - TSkill *pTVar1; - bool bVar2; - TPlayer *pTVar3; - int iVar4; - int iVar5; - int iVar6; - TSkill *sk; - uchar local_18; - TPlayer *pl; - - bVar2 = BeginSendData(Connection); - if (!bVar2) { - return; - } - iVar6 = Connection->NextToWrite; - if (iVar6 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = 0xa1; - Connection->NextToWrite = iVar6 + 1; - } - else { - Connection->Overflow = true; - } - pTVar3 = TConnection::GetPlayer(Connection); - if (pTVar3 == (TPlayer *)0x0) { - error(&DAT_08109720); - return; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[0xb]; - if (pTVar1 == (TSkill *)0x0) { - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3e93; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d36d2: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d36d2; - } -LAB_080d3e93: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3e52; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3725: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - iVar5 = Connection->NextToSend; - if (iVar6 < iVar5 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar4; - goto LAB_080d3725; - } -LAB_080d3e52: - Connection->Overflow = true; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[9]; - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3e13; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3781: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d3781; - } -LAB_080d3e13: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3dd2; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d37d4: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - iVar5 = Connection->NextToSend; - if (iVar6 < iVar5 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar4; - goto LAB_080d37d4; - } -LAB_080d3dd2: - Connection->Overflow = true; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[8]; - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3d93; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3830: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d3830; - } -LAB_080d3d93: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3d52; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3883: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - iVar5 = Connection->NextToSend; - if (iVar6 < iVar5 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar4; - goto LAB_080d3883; - } -LAB_080d3d52: - Connection->Overflow = true; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[10]; - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3d13; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d38df: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d38df; - } -LAB_080d3d13: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3cd2; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3932: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - iVar5 = Connection->NextToSend; - if (iVar6 < iVar5 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar4; - goto LAB_080d3932; - } -LAB_080d3cd2: - Connection->Overflow = true; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[7]; - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3c93; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d398e: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d398e; - } -LAB_080d3c93: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3c52; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d39e1: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - iVar5 = Connection->NextToSend; - if (iVar6 < iVar5 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar4; - goto LAB_080d39e1; - } -LAB_080d3c52: - Connection->Overflow = true; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[6]; - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3c13; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3a3d: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d3a3d; - } -LAB_080d3c13: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3bd2; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3a90: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - iVar5 = Connection->NextToSend; - if (iVar6 < iVar5 + 0x4000) { - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar4; - goto LAB_080d3a90; - } -LAB_080d3bd2: - Connection->Overflow = true; - } - pTVar1 = (pTVar3->super_TCreature).super_TSkillBase.Skills[0xd]; - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3b91; - Connection->OutData[iVar6 % 0x4000] = '\0'; -LAB_080d3aec: - Connection->NextToWrite = iVar6 + 1; - } - else { - iVar4 = TSkill::Get(pTVar1); - iVar5 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar5 + 0x4000) { - local_18 = (uchar)iVar4; - Connection->OutData[iVar6 % 0x4000] = local_18; - goto LAB_080d3aec; - } -LAB_080d3b91: - Connection->Overflow = true; - } - if (pTVar1 == (TSkill *)0x0) { - iVar6 = Connection->NextToWrite; - if (iVar5 + 0x4000 <= iVar6) goto LAB_080d3b50; - Connection->OutData[iVar6 % 0x4000] = '\0'; - } - else { - iVar5 = TSkill::GetProgress(pTVar1); - iVar6 = Connection->NextToWrite; - if (Connection->NextToSend + 0x4000 <= iVar6) { -LAB_080d3b50: - Connection->Overflow = true; - goto LAB_080d3b3e; - } - Connection->OutData[iVar6 % 0x4000] = (uchar)iVar5; - } - Connection->NextToWrite = iVar6 + 1; -LAB_080d3b3e: - FinishSendData(Connection); - return; -} - - - -// WARNING: Variable defined which should be unmapped: State_local - -void SendPlayerState(TConnection *Connection,uchar State) - -{ - int iVar1; - bool bVar2; - int iVar3; - uchar State_local; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0xa2; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = State; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -void SendMessage(TConnection *Connection,int Mode,char *Text,...) - -{ - int iVar1; - bool bVar2; - size_t Length; - uint uVar3; - uint uVar4; - int iVar5; - int iVar6; - char local_101c [4]; - char Buffer [4096]; - - if (Mode - 0x12U < 6) { - bVar2 = BeginSendData(Connection); - if (bVar2) { - vsnprintf(local_101c,0x1000,Text,&stack0x00000010); - iVar1 = Connection->NextToSend; - iVar6 = Connection->NextToWrite; - if (iVar6 < iVar1 + 0x4000) { - iVar5 = iVar6 % 0x4000; - iVar6 = iVar6 + 1; - Connection->OutData[iVar5] = 0xb4; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - if (iVar6 < iVar1 + 0x4000) { - iVar5 = iVar6 % 0x4000; - iVar6 = iVar6 + 1; - Connection->OutData[iVar5] = (uchar)Mode; - Connection->NextToWrite = iVar6; - } - else { - Connection->Overflow = true; - } - Length = strlen(local_101c); - if (iVar6 < iVar1 + 0x3fff) { - Connection->OutData[iVar6 % 0x4000] = (uchar)(Length & 0xffff); - uVar4 = iVar6 + 1; - uVar3 = iVar6 + 0x4000; - if (-1 < (int)uVar4) { - uVar3 = uVar4; - } - *(char *)((int)Connection + (uVar4 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar6 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,local_101c,Length); - } - FinishSendData(Connection); - } - } - else { - error(&DAT_08109760,Mode); - } - return; -} - - - -void SendSnapback(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - TPlayer *pl; - TPlayer *pTVar3; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = 0xb5; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - pTVar3 = TConnection::GetPlayer(Connection); - if (pTVar3 != (TPlayer *)0x0) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = (uchar)(pTVar3->super_TCreature).Direction; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Sender_local - -void SendTalk(TConnection *Connection,ulong StatementID,char *Sender,int Mode,char *Text,int Data) - -{ - bool bVar1; - size_t sVar2; - uint uVar3; - int iVar4; - uint uVar5; - int local_28; - uchar local_24; - uchar local_1c; - int Data_local; - char *Text_local; - char *Sender_local; - - if ((((Mode != 4) && (Mode != 7)) && (Mode != 8)) && - (((Mode != 6 && (Mode != 0xb)) && (Mode != 9)))) { - error(&DAT_081097c0); - return; - } - if (Sender == (char *)0x0) { - Connection = (TConnection *)s_SendTalk______Sender_ist_NULL__081097a0; - } - else { - if (Text != (char *)0x0) { - bVar1 = BeginSendData(Connection); - if (bVar1) { - local_28 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < local_28 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 0xaa; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < local_28 + 0x3ffd) { - Connection->OutData[iVar4 % 0x4000] = (uchar)StatementID; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(StatementID >> 8); - uVar5 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(StatementID >> 0x10); - uVar5 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(StatementID >> 0x18); - Connection->NextToWrite = iVar4 + 4; - } - else { - Connection->Overflow = true; - } - if (Sender == (char *)0x0) { - error("SendString: String ist NULL.\n"); - local_28 = Connection->NextToSend; - } - else { - sVar2 = strlen(Sender); - iVar4 = Connection->NextToWrite; - if (iVar4 < local_28 + 0x3fff) { - local_24 = (uchar)(sVar2 & 0xffff); - Connection->OutData[iVar4 % 0x4000] = local_24; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - local_24 = (uchar)((sVar2 & 0xffff) >> 8); - *(uchar *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - local_24; - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar2) { - SendText(Connection,Sender,sVar2); - local_28 = Connection->NextToSend; - } - } - iVar4 = Connection->NextToWrite; - if (iVar4 < local_28 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = (uchar)Mode; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - if (Mode == 6) { - iVar4 = Connection->NextToWrite; - if (iVar4 < local_28 + 0x3ffd) { - local_1c = (uchar)Data; - uVar5 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = local_1c; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - local_1c = (uchar)((uint)Data >> 8); - *(uchar *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - local_1c; - uVar5 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - local_1c = (uchar)((uint)Data >> 0x10); - *(uchar *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - local_1c; - uVar5 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - local_1c = (uchar)((uint)Data >> 0x18); - Connection->NextToWrite = iVar4 + 4; - *(uchar *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - local_1c; - } - else { - Connection->Overflow = true; - } - } - if (Text == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - sVar2 = strlen(Text); - iVar4 = Connection->NextToWrite; - if (iVar4 < local_28 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(sVar2 & 0xffff); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((sVar2 & 0xffff) >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar2) { - SendText(Connection,Text,sVar2); - } - } - FinishSendData(Connection); - return; - } - return; - } - Connection = (TConnection *)s_SendTalk______Text_ist_NULL__08109deb; - } - error((char *)Connection); - return; -} - - - -// WARNING: Removing unreachable block (ram,0x080d4a56) -// WARNING: Variable defined which should be unmapped: Sender_local - -void __regparm2 -SendTalk(TConnection *Connection,ulong StatementID,char *Sender,int Mode,int Channel,char *Text) - -{ - bool bVar1; - size_t sVar2; - uint uVar3; - int iVar4; - uint uVar5; - int iVar6; - undefined2 in_stack_00000014; - char *in_stack_00000018; - int local_2c; - char local_28; - char local_24; - char *Text_local; - int Channel_local; - char *Sender_local; - - if ((((Text != (char *)0x5) && (Text != (char *)0xa)) && (Text != (char *)0xc)) && - (Text != (char *)0xe)) { - error(&DAT_08109820); - return; - } - if (Channel == 0) { - Sender = "SendTalk (C): Sender ist NULL.\n"; - } - else { - if (in_stack_00000018 != (char *)0x0) { - bVar1 = BeginSendData((TConnection *)Sender); - if (!bVar1) { - return; - } - local_2c = *(int *)(Sender + 0x4808); - iVar4 = *(int *)(Sender + 0x4810); - if (iVar4 < local_2c + 0x4000) { - Sender[iVar4 % 0x4000 + 0x806] = -0x56; - iVar4 = iVar4 + 1; - *(int *)(Sender + 0x4810) = iVar4; - } - else { - Sender[0x4814] = '\x01'; - } - if (iVar4 < local_2c + 0x3ffd) { - Sender[iVar4 % 0x4000 + 0x806] = (char)Mode; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = (char)((uint)Mode >> 8); - uVar5 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = (char)((uint)Mode >> 0x10); - uVar5 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = (char)((uint)Mode >> 0x18); - *(int *)(Sender + 0x4810) = iVar4 + 4; - } - else { - Sender[0x4814] = '\x01'; - } - if (Text == (char *)0xe) { - sVar2 = strlen(""); - iVar4 = *(int *)(Sender + 0x4810); - if (iVar4 < local_2c + 0x3fff) { - local_24 = (char)(sVar2 & 0xffff); - Sender[iVar4 % 0x4000 + 0x806] = local_24; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - local_24 = (char)((sVar2 & 0xffff) >> 8); - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = local_24; - *(int *)(Sender + 0x4810) = iVar4 + 2; - } - else { - Sender[0x4814] = '\x01'; - } - if (0 < (int)sVar2) { - SendText((TConnection *)Sender,"",sVar2); - local_2c = *(int *)(Sender + 0x4808); - } - } - else { - if (Channel == 0) { - error("SendString: String ist NULL.\n"); - } - else { - sVar2 = strlen((char *)Channel); - iVar4 = *(int *)(Sender + 0x4810); - if (iVar4 < local_2c + 0x3fff) { - local_28 = (char)(sVar2 & 0xffff); - Sender[iVar4 % 0x4000 + 0x806] = local_28; - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - local_28 = (char)((sVar2 & 0xffff) >> 8); - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = local_28; - *(int *)(Sender + 0x4810) = iVar4 + 2; - } - else { - Sender[0x4814] = '\x01'; - } - if ((int)sVar2 < 1) goto LAB_080d47d5; - SendText((TConnection *)Sender,(char *)Channel,sVar2); - } - local_2c = *(int *)(Sender + 0x4808); - } -LAB_080d47d5: - iVar4 = *(int *)(Sender + 0x4810); - if (iVar4 < local_2c + 0x4000) { - iVar6 = iVar4 % 0x4000; - iVar4 = iVar4 + 1; - Sender[iVar6 + 0x806] = (char)Text; - *(int *)(Sender + 0x4810) = iVar4; - } - else { - Sender[0x4814] = '\x01'; - } - if (iVar4 < local_2c + 0x3fff) { - uVar5 = iVar4 + 1; - Sender[iVar4 % 0x4000 + 0x806] = (char)in_stack_00000014; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = - (char)((ushort)in_stack_00000014 >> 8); - *(int *)(Sender + 0x4810) = iVar4 + 2; - } - else { - Sender[0x4814] = '\x01'; - } - if (in_stack_00000018 == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - sVar2 = strlen(in_stack_00000018); - iVar4 = *(int *)(Sender + 0x4810); - if (iVar4 < local_2c + 0x3fff) { - Sender[iVar4 % 0x4000 + 0x806] = (char)(sVar2 & 0xffff); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - Sender[(uVar5 - (uVar3 & 0xffffc000)) + 0x806] = (char)((sVar2 & 0xffff) >> 8); - *(int *)(Sender + 0x4810) = iVar4 + 2; - } - else { - Sender[0x4814] = '\x01'; - } - if (0 < (int)sVar2) { - SendText((TConnection *)Sender,in_stack_00000018,sVar2); - } - } - FinishSendData((TConnection *)Sender); - return; - } - Sender = "SendTalk (C): Text ist NULL.\n"; - } - error(Sender); - return; -} - - - -// WARNING: Variable defined which should be unmapped: Sender_local -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendTalk(TConnection *Connection,ulong StatementID,char *Sender,int Mode,int x,int y,int z, - char *Text) - -{ - bool bVar1; - size_t sVar2; - uint uVar3; - int iVar4; - uint uVar5; - int local_30; - char *Text_local; - int z_local; - int y_local; - int x_local; - int Mode_local; - char *Sender_local; - - if (((2 < Mode - 1U) && (Mode != 0x10)) && (Mode != 0x11)) { - error(&DAT_08109880); - return; - } - if (Sender == (char *)0x0) { - Connection = (TConnection *)s_SendTalk__K___Sender_ist_NULL__08109860; - } - else { - if (Text != (char *)0x0) { - bVar1 = BeginSendData(Connection); - if (bVar1) { - local_30 = Connection->NextToSend; - iVar4 = Connection->NextToWrite; - if (iVar4 < local_30 + 0x4000) { - Connection->OutData[iVar4 % 0x4000] = 0xaa; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < local_30 + 0x3ffd) { - uVar5 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)StatementID; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(StatementID >> 8); - uVar5 = iVar4 + 2; - uVar3 = iVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(StatementID >> 0x10); - uVar5 = iVar4 + 3; - uVar3 = iVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(StatementID >> 0x18); - Connection->NextToWrite = iVar4 + 4; - } - else { - Connection->Overflow = true; - } - if (Sender == (char *)0x0) { - error("SendString: String ist NULL.\n"); - local_30 = Connection->NextToSend; - } - else { - sVar2 = strlen(Sender); - iVar4 = Connection->NextToWrite; - if (iVar4 < local_30 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(sVar2 & 0xffff); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((sVar2 & 0xffff) >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar2) { - SendText(Connection,Sender,sVar2); - local_30 = Connection->NextToSend; - } - } - iVar4 = Connection->NextToWrite; - if (iVar4 < local_30 + 0x4000) { - x_local._0_1_ = (uchar)Mode; - Connection->OutData[iVar4 % 0x4000] = (uchar)x_local; - iVar4 = iVar4 + 1; - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < local_30 + 0x3fff) { - uVar5 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)x; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((uint)x >> 8); - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < local_30 + 0x3fff) { - uVar5 = iVar4 + 1; - Connection->OutData[iVar4 % 0x4000] = (uchar)y; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - iVar4 = iVar4 + 2; - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((uint)y >> 8); - Connection->NextToWrite = iVar4; - } - else { - Connection->Overflow = true; - } - if (iVar4 < local_30 + 0x4000) { - Text_local._0_1_ = (uchar)z; - Connection->OutData[iVar4 % 0x4000] = (uchar)Text_local; - Connection->NextToWrite = iVar4 + 1; - } - else { - Connection->Overflow = true; - } - if (Text == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - sVar2 = strlen(Text); - iVar4 = Connection->NextToWrite; - if (iVar4 < local_30 + 0x3fff) { - Connection->OutData[iVar4 % 0x4000] = (uchar)(sVar2 & 0xffff); - uVar5 = iVar4 + 1; - uVar3 = iVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)((sVar2 & 0xffff) >> 8); - Connection->NextToWrite = iVar4 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar2) { - SendText(Connection,Text,sVar2); - } - } - FinishSendData(Connection); - return; - } - return; - } - Connection = (TConnection *)s_SendTalk__K___Text_ist_NULL__08109e27; - } - error((char *)Connection); - return; -} - - - -// WARNING: Removing unreachable block (ram,0x080d5313) -// WARNING: Variable defined which should be unmapped: pl - -void SendChannels(TConnection *Connection) - -{ - int iVar1; - int iVar2; - ulong uVar3; - uint uVar4; - bool bVar5; - size_t sVar6; - uint uVar7; - int i; - int iVar8; - uchar uVar9; - uchar uVar10; - int Count; - uint uVar11; - uint uVar12; - int i_1; - uint uVar13; - ulong uStack_50; - size_t sStack_44; - undefined1 auStack_40 [12]; - uint local_34; - char *local_28; - undefined1 *local_24; - bool_0_ *Available; - int local_1c; - int Channels; - TPlayer *pTStack_14; - bool OwnChannel; - TPlayer *pl; - - Available = &stack0xffffffb4; - uStack_50 = 0x80d5017; - bVar5 = BeginSendData(Connection); - if (bVar5) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = 0xab; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - uStack_50 = 0x80d504d; - pTStack_14 = TConnection::GetPlayer(Connection); - if (pTStack_14 != (TPlayer *)0x0) { - uVar9 = '\0'; - iVar8 = 0; - uStack_50 = 0x80d506a; - Channels._3_1_ = MayOpenChannel((pTStack_14->super_TCreature).ID); - uStack_50 = 0x80d5072; - local_1c = GetNumberOfChannels(); - iVar1 = -(local_1c + 0xfU & 0xfffffff0); - local_24 = auStack_40 + iVar1; - uVar10 = '\0'; - if (0 < local_1c) { - do { - uVar3 = (pTStack_14->super_TCreature).ID; - *(int *)(&stack0xffffffb4 + iVar1) = iVar8; - *(ulong *)(&stack0xffffffb8 + iVar1) = uVar3; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d53bb; - bVar5 = ChannelAvailable(*(int *)(&stack0xffffffb4 + iVar1), - *(ulong *)(&stack0xffffffb8 + iVar1)); - uVar9 = uVar10; - if (bVar5) { - uVar9 = uVar10 + '\x01'; - } - local_24[iVar8] = bVar5; - iVar8 = iVar8 + 1; - uVar10 = uVar9; - } while (iVar8 < local_1c); - } - if (Channels._3_1_ != '\0') { - uVar9 = uVar9 + '\x01'; - } - iVar8 = Connection->NextToSend; - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar8 + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = uVar9; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - if (Channels._3_1_ != '\0') { - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar8 + 0x3fff) { - uVar11 = iVar2 + 1; - uVar13 = iVar2 + 0x4000; - if (-1 < (int)uVar11) { - uVar13 = uVar11; - } - Connection->OutData[iVar2 % 0x4000] = 0xff; - *(undefined1 *)((int)Connection + (uVar11 - (uVar13 & 0xffffc000)) + 0x806) = - 0xff; - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - *(char **)(&stack0xffffffb4 + iVar1) = "Private Chat Channel"; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d50f8; - sVar6 = strlen(*(char **)(&stack0xffffffb4 + iVar1)); - iVar8 = Connection->NextToWrite; - if (iVar8 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar8 % 0x4000] = (uchar)(sVar6 & 0xffff); - uVar11 = iVar8 + 1; - uVar13 = iVar8 + 0x4000; - if (-1 < (int)uVar11) { - uVar13 = uVar11; - } - *(char *)((int)Connection + (uVar11 - (uVar13 & 0xffffc000)) + 0x806) = - (char)((sVar6 & 0xffff) >> 8); - Connection->NextToWrite = iVar8 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar6) { - *(size_t *)((int)&sStack_44 + iVar1) = sVar6; - *(char **)(&stack0xffffffb8 + iVar1) = "Private Chat Channel"; - *(TConnection **)(&stack0xffffffb4 + iVar1) = Connection; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d513b; - SendText(*(TConnection **)(&stack0xffffffb4 + iVar1), - *(char **)(&stack0xffffffb8 + iVar1),*(int *)((int)&sStack_44 + iVar1)) - ; - } - } - if (0 < local_1c) { - uVar13 = 0; - do { - if (local_24[uVar13] != '\0') { - iVar8 = Connection->NextToWrite; - if (iVar8 < Connection->NextToSend + 0x3fff) { - uVar7 = iVar8 + 1; - Connection->OutData[iVar8 % 0x4000] = (uchar)(uVar13 & 0xffff); - uVar11 = iVar8 + 0x4000; - if (-1 < (int)uVar7) { - uVar11 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar11 & 0xffffc000)) + 0x806) = - (char)((uVar13 & 0xffff) >> 8); - Connection->NextToWrite = iVar8 + 2; - } - else { - Connection->Overflow = true; - } - uVar3 = (pTStack_14->super_TCreature).ID; - *(uint *)(&stack0xffffffb4 + iVar1) = uVar13; - *(ulong *)(&stack0xffffffb8 + iVar1) = uVar3; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d5198; - local_28 = GetChannelName(*(int *)(&stack0xffffffb4 + iVar1), - *(ulong *)(&stack0xffffffb8 + iVar1)); - if (local_28 == (char *)0x0) { - *(char **)(&stack0xffffffb4 + iVar1) = "SendString: String ist NULL.\n"; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d5270; - error(*(char **)(&stack0xffffffb4 + iVar1)); - } - else { - *(char **)(&stack0xffffffb4 + iVar1) = local_28; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d51ae; - sVar6 = strlen(*(char **)(&stack0xffffffb4 + iVar1)); - uVar11 = sVar6 & 0xffff; - local_34 = uVar11; - iVar8 = Connection->NextToWrite; - if (iVar8 < Connection->NextToSend + 0x3fff) { - local_34._0_1_ = (uchar)uVar11; - Connection->OutData[iVar8 % 0x4000] = (uchar)local_34; - uVar12 = iVar8 + 1; - uVar7 = iVar8 + 0x4000; - if (-1 < (int)uVar12) { - uVar7 = uVar12; - } - local_34 = uVar11 >> 8; - uVar4 = local_34; - local_34._0_1_ = (uchar)(uVar11 >> 8); - *(uchar *)((int)Connection + (uVar12 - (uVar7 & 0xffffc000)) + 0x806 - ) = (uchar)local_34; - Connection->NextToWrite = iVar8 + 2; - local_34 = uVar4; - } - else { - Connection->Overflow = true; - } - if (0 < (int)sVar6) { - *(size_t *)((int)&sStack_44 + iVar1) = sVar6; - *(char **)(&stack0xffffffb8 + iVar1) = local_28; - *(TConnection **)(&stack0xffffffb4 + iVar1) = Connection; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d51ef; - SendText(*(TConnection **)(&stack0xffffffb4 + iVar1), - *(char **)(&stack0xffffffb8 + iVar1), - *(int *)((int)&sStack_44 + iVar1)); - } - } - } - uVar13 = uVar13 + 1; - } while ((int)uVar13 < local_1c); - } - *(TConnection **)(&stack0xffffffb4 + iVar1) = Connection; - *(undefined4 *)((int)&uStack_50 + iVar1) = 0x80d5204; - FinishSendData(*(TConnection **)(&stack0xffffffb4 + iVar1)); - } - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: pl - -void SendOpenChannel(TConnection *Connection,int Channel) - -{ - bool bVar1; - TPlayer *pTVar2; - int iVar3; - char *__s; - size_t Length; - uint uVar4; - uint uVar5; - TPlayer *pl; - - bVar1 = BeginSendData(Connection); - if (bVar1) { - if (Channel == 3) { - error("SendOpenChannel: Kanal ist GM-Request-Queue.\n"); - return; - } - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0xac; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - pTVar2 = TConnection::GetPlayer(Connection); - if (pTVar2 != (TPlayer *)0x0) { - if ((-1 < Channel) && (iVar3 = GetNumberOfChannels(), Channel < iVar3)) { - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)(Channel & 0xffffU); - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Channel & 0xffffU) >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - __s = GetChannelName(Channel,(pTVar2->super_TCreature).ID); - if (__s == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - Length = strlen(__s); - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,__s,Length); - } - } - FinishSendData(Connection); - return; - } - error(&DAT_081098a0); - return; - } - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Name_local -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendPrivateChannel(TConnection *Connection,char *Name) - -{ - int iVar1; - int iVar2; - bool bVar3; - size_t Length; - uint uVar4; - uint uVar5; - char *Name_local; - - bVar3 = BeginSendData(Connection); - if (!bVar3) { - return; - } - iVar1 = Connection->NextToSend; - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar1 + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = 0xad; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - if (Name != (char *)0x0) { - Length = strlen(Name); - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar1 + 0x3fff) { - Connection->OutData[iVar2 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar2 + 1; - uVar4 = iVar2 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,Name,Length); - } - FinishSendData(Connection); - return; - } - error("SendPrivateChannel: Name ist NULL.\n"); - return; -} - - - -void SendOpenRequestQueue(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - int iVar3; - uint uVar4; - uint uVar5; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0xae; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x3fff) { - uVar5 = iVar3 + 1; - Connection->OutData[iVar3 % 0x4000] = '\x03'; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(undefined1 *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = 0; - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Name_local - -void __regparm2 SendDeleteRequest(TConnection *Connection,char *Name) - -{ - int iVar1; - int iVar2; - bool bVar3; - size_t Length; - uint uVar4; - uint uVar5; - TConnection *in_stack_00000004; - char *in_stack_00000008; - char *Name_local; - - bVar3 = BeginSendData(in_stack_00000004); - if (!bVar3) { - return; - } - iVar1 = in_stack_00000004->NextToSend; - iVar2 = in_stack_00000004->NextToWrite; - if (iVar2 < iVar1 + 0x4000) { - in_stack_00000004->OutData[iVar2 % 0x4000] = 0xaf; - in_stack_00000004->NextToWrite = iVar2 + 1; - } - else { - in_stack_00000004->Overflow = true; - } - if (in_stack_00000008 != (char *)0x0) { - Length = strlen(in_stack_00000008); - iVar2 = in_stack_00000004->NextToWrite; - if (iVar2 < iVar1 + 0x3fff) { - in_stack_00000004->OutData[iVar2 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar2 + 1; - uVar4 = iVar2 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)in_stack_00000004 + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - in_stack_00000004->NextToWrite = iVar2 + 2; - } - else { - in_stack_00000004->Overflow = true; - } - if (0 < (int)Length) { - SendText(in_stack_00000004,in_stack_00000008,Length); - } - FinishSendData(in_stack_00000004); - return; - } - error("SendDeleteRequest: Name ist NULL.\n"); - return; -} - - - -// WARNING: Variable defined which should be unmapped: Name_local -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void SendFinishRequest(TConnection *Connection,char *Name) - -{ - int iVar1; - int iVar2; - bool bVar3; - size_t Length; - uint uVar4; - uint uVar5; - char *Name_local; - - bVar3 = BeginSendData(Connection); - if (!bVar3) { - return; - } - iVar1 = Connection->NextToSend; - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar1 + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = 0xb0; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - if (Name != (char *)0x0) { - Length = strlen(Name); - iVar2 = Connection->NextToWrite; - if (iVar2 < iVar1 + 0x3fff) { - Connection->OutData[iVar2 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar2 + 1; - uVar4 = iVar2 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,Name,Length); - } - FinishSendData(Connection); - return; - } - error("SendFinishRequest: Name ist NULL.\n"); - return; -} - - - -void SendCloseRequest(TConnection *Connection) - -{ - int iVar1; - bool bVar2; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToWrite; - if (iVar1 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar1 % 0x4000] = 0xb1; - Connection->NextToWrite = iVar1 + 1; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: pl - -void SendOpenOwnChannel(TConnection *Connection,int Channel) - -{ - bool bVar1; - TPlayer *pTVar2; - int iVar3; - char *__s; - size_t Length; - uint uVar4; - uint uVar5; - TPlayer *pl; - - bVar1 = BeginSendData(Connection); - if (bVar1) { - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0xb2; - Connection->NextToWrite = iVar3 + 1; - } - else { - Connection->Overflow = true; - } - pTVar2 = TConnection::GetPlayer(Connection); - if (pTVar2 != (TPlayer *)0x0) { - if ((-1 < Channel) && (iVar3 = GetNumberOfChannels(), Channel < iVar3)) { - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)(Channel & 0xffffU); - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Channel & 0xffffU) >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - __s = GetChannelName(Channel,(pTVar2->super_TCreature).ID); - if (__s == (char *)0x0) { - error("SendString: String ist NULL.\n"); - } - else { - Length = strlen(__s); - iVar3 = Connection->NextToWrite; - if (iVar3 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar3 % 0x4000] = (uchar)(Length & 0xffff); - uVar5 = iVar3 + 1; - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Length & 0xffff) >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - if (0 < (int)Length) { - SendText(Connection,__s,Length); - } - } - FinishSendData(Connection); - return; - } - error(&DAT_081099e0); - return; - } - } - return; -} - - - -void SendCloseChannel(TConnection *Connection,int Channel) - -{ - int iVar1; - bool bVar2; - int iVar3; - uint uVar4; - uint uVar5; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - iVar3 = Connection->NextToWrite; - if (iVar3 < iVar1 + 0x4000) { - Connection->OutData[iVar3 % 0x4000] = 0xb3; - iVar3 = iVar3 + 1; - Connection->NextToWrite = iVar3; - } - else { - Connection->Overflow = true; - } - if (iVar3 < iVar1 + 0x3fff) { - uVar5 = iVar3 + 1; - Connection->OutData[iVar3 % 0x4000] = (uchar)(Channel & 0xffffU); - uVar4 = iVar3 + 0x4000; - if (-1 < (int)uVar5) { - uVar4 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar4 & 0xffffc000)) + 0x806) = - (char)((Channel & 0xffffU) >> 8); - Connection->NextToWrite = iVar3 + 2; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -void SendOutfit(TConnection *Connection) - -{ - undefined2 uVar1; - int iVar2; - bool bVar3; - TPlayer *pTVar4; - uint uVar5; - short sVar6; - TPlayer *pl; - uint uVar7; - - bVar3 = BeginSendData(Connection); - if (bVar3) { - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x4000) { - Connection->OutData[iVar2 % 0x4000] = 200; - Connection->NextToWrite = iVar2 + 1; - } - else { - Connection->Overflow = true; - } - pTVar4 = TConnection::GetPlayer(Connection); - if (pTVar4 != (TPlayer *)0x0) { - uVar1 = (undefined2)(pTVar4->super_TCreature).OrgOutfit.OutfitID; - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x3fff) { - Connection->OutData[iVar2 % 0x4000] = (uchar)uVar1; - uVar7 = iVar2 + 1; - uVar5 = iVar2 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)uVar1 >> 8); - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - SendText(Connection,(char *)(pTVar4->super_TCreature).OrgOutfit.field_1.Colors,4); - if ((pTVar4->super_TCreature).Sex == 1) { - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x3fff) { - uVar7 = iVar2 + 1; - Connection->OutData[iVar2 % 0x4000] = 0x80; - uVar5 = iVar2 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(undefined1 *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = 0; - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - bVar3 = CheckRight((pTVar4->super_TCreature).ID,PREMIUM_ACCOUNT); - sVar6 = (ushort)bVar3 * 3 + 0x83; - } - else { - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x3fff) { - uVar7 = iVar2 + 1; - Connection->OutData[iVar2 % 0x4000] = 0x88; - uVar5 = iVar2 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(undefined1 *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = 0; - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - bVar3 = CheckRight((pTVar4->super_TCreature).ID,PREMIUM_ACCOUNT); - sVar6 = (ushort)bVar3 * 3 + 0x8b; - } - iVar2 = Connection->NextToWrite; - if (iVar2 < Connection->NextToSend + 0x3fff) { - uVar7 = iVar2 + 1; - Connection->OutData[iVar2 % 0x4000] = (uchar)sVar6; - uVar5 = iVar2 + 0x4000; - if (-1 < (int)uVar7) { - uVar5 = uVar7; - } - *(char *)((int)Connection + (uVar7 - (uVar5 & 0xffffc000)) + 0x806) = - (char)((ushort)sVar6 >> 8); - Connection->NextToWrite = iVar2 + 2; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Name_local - -void __regparm2 SendBuddyData(TConnection *Connection,ulong CharacterID,char *Name,bool Online) - -{ - bool bVar1; - size_t Length; - uint uVar2; - int iVar3; - uint uVar4; - undefined3 in_stack_00000009; - char *in_stack_0000000c; - char in_stack_00000010; - int local_20; - bool Online_local; - char *Name_local; - - bVar1 = BeginSendData((TConnection *)Name); - if (bVar1) { - local_20 = *(int *)(Name + 0x4808); - iVar3 = *(int *)(Name + 0x4810); - if (iVar3 < local_20 + 0x4000) { - Name[iVar3 % 0x4000 + 0x806] = -0x2e; - iVar3 = iVar3 + 1; - *(int *)(Name + 0x4810) = iVar3; - } - else { - Name[0x4814] = '\x01'; - } - if (iVar3 < local_20 + 0x3ffd) { - uVar4 = iVar3 + 1; - Name[iVar3 % 0x4000 + 0x806] = Online; - uVar2 = iVar3 + 0x4000; - if (-1 < (int)uVar4) { - uVar2 = uVar4; - } - Name[(uVar4 - (uVar2 & 0xffffc000)) + 0x806] = (char)in_stack_00000009; - uVar4 = iVar3 + 2; - uVar2 = iVar3 + 0x4001; - if (-1 < (int)uVar4) { - uVar2 = uVar4; - } - Name[(uVar4 - (uVar2 & 0xffffc000)) + 0x806] = (char)((uint3)in_stack_00000009 >> 8); - uVar4 = iVar3 + 3; - uVar2 = iVar3 + 0x4002; - if (-1 < (int)uVar4) { - uVar2 = uVar4; - } - Name[(uVar4 - (uVar2 & 0xffffc000)) + 0x806] = (char)((uint3)in_stack_00000009 >> 0x10); - *(int *)(Name + 0x4810) = iVar3 + 4; - } - else { - Name[0x4814] = '\x01'; - } - if (in_stack_0000000c != (char *)0x0) { - Length = strlen(in_stack_0000000c); - iVar3 = *(int *)(Name + 0x4810); - if (iVar3 < local_20 + 0x3fff) { - Name[iVar3 % 0x4000 + 0x806] = (char)(Length & 0xffff); - uVar4 = iVar3 + 1; - uVar2 = iVar3 + 0x4000; - if (-1 < (int)uVar4) { - uVar2 = uVar4; - } - Name[(uVar4 - (uVar2 & 0xffffc000)) + 0x806] = (char)((Length & 0xffff) >> 8); - *(int *)(Name + 0x4810) = iVar3 + 2; - } - else { - Name[0x4814] = '\x01'; - } - if (0 < (int)Length) { - SendText((TConnection *)Name,in_stack_0000000c,Length); - local_20 = *(int *)(Name + 0x4808); - } - iVar3 = *(int *)(Name + 0x4810); - if (iVar3 < local_20 + 0x4000) { - Name[iVar3 % 0x4000 + 0x806] = in_stack_00000010 != '\0'; - *(int *)(Name + 0x4810) = iVar3 + 1; - } - else { - Name[0x4814] = '\x01'; - } - FinishSendData((TConnection *)Name); - return; - } - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Online_local - -void SendBuddyStatus(TConnection *Connection,ulong CharacterID,bool Online) - -{ - int iVar1; - bool bVar2; - uint uVar3; - uint uVar4; - uint uVar5; - bool Online_local; - - bVar2 = BeginSendData(Connection); - if (bVar2) { - iVar1 = Connection->NextToSend; - uVar4 = Connection->NextToWrite; - if ((int)uVar4 < iVar1 + 0x4000) { - uVar3 = uVar4 + 0x3fff; - if (-1 < (int)uVar4) { - uVar3 = uVar4; - } - *(char *)((int)Connection + (uVar4 - (uVar3 & 0xffffc000)) + 0x806) = !Online + -0x2d; - uVar4 = uVar4 + 1; - Connection->NextToWrite = uVar4; - } - else { - Connection->Overflow = true; - } - if ((int)uVar4 < iVar1 + 0x3ffd) { - uVar5 = uVar4 + 1; - Connection->OutData[(int)uVar4 % 0x4000] = (uchar)CharacterID; - uVar3 = uVar4 + 0x4000; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(CharacterID >> 8); - uVar5 = uVar4 + 2; - uVar3 = uVar4 + 0x4001; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(CharacterID >> 0x10); - uVar5 = uVar4 + 3; - uVar3 = uVar4 + 0x4002; - if (-1 < (int)uVar5) { - uVar3 = uVar5; - } - *(char *)((int)Connection + (uVar5 - (uVar3 & 0xffffc000)) + 0x806) = - (char)(CharacterID >> 0x18); - Connection->NextToWrite = uVar4 + 4; - } - else { - Connection->Overflow = true; - } - FinishSendData(Connection); - return; - } - return; -} - - - -// WARNING: Variable defined which should be unmapped: Message - -void BroadcastMessage(int Mode,char *Text,...) - -{ - TConnection *Connection_00; - TConnection *Connection; - char local_40c [4]; - char Message [1024]; - - vsnprintf(local_40c,0x400,Text,&stack0x0000000c); - Connection_00 = GetFirstConnection(); - while (Connection_00 != (TConnection *)0x0) { - if (Connection_00->State - CONNECTION_LOGIN < 4) { - SendMessage(Connection_00,Mode,local_40c); - } - Connection_00 = GetNextConnection(); - } - return; -} - - - -void DeleteGamemasterRequest(char *Name) - -{ - bool bVar1; - TPlayer *pl; - TConnection *this; - TPlayer *pTVar2; - undefined3 extraout_var; - char *Name_00; - TConnection *Connection; - - if (Name != (char *)0x0) { - this = GetFirstConnection(); - while (this != (TConnection *)0x0) { - if ((this->State - CONNECTION_LOGIN < 4) && - (pTVar2 = TConnection::GetPlayer(this), pTVar2 != (TPlayer *)0x0)) { - bVar1 = ChannelSubscribed(3,(pTVar2->super_TCreature).ID); - if (bVar1) { - SendDeleteRequest((TConnection *)CONCAT31(extraout_var,bVar1),Name_00); - } - } - this = GetNextConnection(); - } - return; - } - error("DeleteGamemasterRequest: Name ist NULL.\n"); - return; -} - - - // WARNING: Unknown calling convention -- yet parameter storage is locked void _GLOBAL__I__Z13BeginSendDataP11TConnection(void) diff --git a/src/connections.cc b/src/connections.cc index 2604a9e..fe26fea 100644 --- a/src/connections.cc +++ b/src/connections.cc @@ -11,79 +11,8 @@ static Semaphore ConnectionMutex(1); static int ConnectionIterator; -static TConnection *FirstSendingConnection; static TConnection Connections[MAX_CONNECTIONS]; -enum ClientCommand: int { - CL_CMD_LOGIN = 10, - CL_CMD_LOGIN_TREATED = 11, - CL_CMD_LOGOUT = 20, - CL_CMD_PING = 30, - CL_CMD_GO = 100, - CL_CMD_GO_NORTH = 101, - CL_CMD_GO_EAST = 102, - CL_CMD_GO_SOUTH = 103, - CL_CMD_GO_WEST = 104, - CL_CMD_GO_STOP = 105, - CL_CMD_GO_NORTHEAST = 106, - CL_CMD_GO_SOUTHEAST = 107, - CL_CMD_GO_SOUTHWEST = 108, - CL_CMD_GO_NORTHWEST = 109, - CL_CMD_ROTATE_NORTH = 111, - CL_CMD_ROTATE_EAST = 112, - CL_CMD_ROTATE_SOUTH = 113, - CL_CMD_ROTATE_WEST = 114, - CL_CMD_MOVE_OBJECT = 120, - CL_CMD_TRADE_OBJECT = 125, - CL_CMD_INSPECT_TRADE = 126, - CL_CMD_ACCEPT_TRADE = 127, - CL_CMD_REJECT_TRADE = 128, - CL_CMD_USE_OBJECT = 130, - CL_CMD_USE_TWO_OBJECTS = 131, - CL_CMD_USE_ON_CREATURE = 132, - CL_CMD_TURN_OBJECT = 133, - CL_CMD_CLOSE_CONTAINER = 135, - CL_CMD_UP_CONTAINER = 136, - CL_CMD_EDIT_TEXT = 137, - CL_CMD_EDIT_LIST = 138, - CL_CMD_LOOK_AT_POINT = 140, - CL_CMD_TALK = 150, - CL_CMD_GET_CHANNELS = 151, - CL_CMD_JOIN_CHANNEL = 152, - CL_CMD_LEAVE_CHANNEL = 153, - CL_CMD_PRIVATE_CHANNEL = 154, - CL_CMD_PROCESS_REQUEST = 155, - CL_CMD_REMOVE_REQUEST = 156, - CL_CMD_CANCEL_REQUEST = 157, - CL_CMD_SET_TACTICS = 160, - CL_CMD_ATTACK = 161, - CL_CMD_FOLLOW = 162, - CL_CMD_INVITE_TO_PARTY = 163, - CL_CMD_JOIN_PARTY = 164, - CL_CMD_REVOKE_INVITATION = 165, - CL_CMD_PASS_LEADERSHIP = 166, - CL_CMD_LEAVE_PARTY = 167, - CL_CMD_OPEN_CHANNEL = 170, - CL_CMD_INVITE_TO_CHANNEL = 171, - CL_CMD_EXCLUDE_FROM_CHANNEL = 172, - CL_CMD_CANCEL = 190, - CL_CMD_REFRESH_FIELD = 201, - CL_CMD_REFRESH_CONTAINER = 202, - CL_CMD_GET_OUTFIT = 210, - CL_CMD_SET_OUTFIT = 211, - CL_CMD_ADD_BUDDY = 220, - CL_CMD_REMOVE_BUDDY = 221, - CL_CMD_BUG_REPORT = 230, - CL_CMD_RULE_VIOLATION = 231, - CL_CMD_ERROR_FILE_ENTRY = 232, -}; - -enum ServerCommand: int { - SV_CMD_LOGIN_ERROR = 20, - SV_CMD_LOGIN_PREMIUM = 21, - SV_CMD_LOGIN_WAITINGLIST = 22, -}; - // TConnection // ============================================================================= TConnection::TConnection(void){ @@ -563,13 +492,16 @@ void ProcessConnections(void){ } void InitConnections(void){ + InitSending(); + InitReceiving(); + ConnectionIterator = 0; - FirstSendingConnection = NULL; for(int i = 0; i < MAX_CONNECTIONS; i += 1){ Connections[i].State = CONNECTION_FREE; } } void ExitConnections(void){ - // no-op + ExitSending(); + ExitReceiving(); } diff --git a/src/connections.hh b/src/connections.hh index 921a604..17cf7df 100644 --- a/src/connections.hh +++ b/src/connections.hh @@ -4,10 +4,139 @@ #include "common.hh" #include "crypto.hh" #include "enums.hh" +#include "map.hh" struct TConnection; struct TPlayer; +enum ClientCommand: int { + CL_CMD_LOGIN = 10, + CL_CMD_LOGIN_TREATED = 11, + CL_CMD_LOGOUT = 20, + CL_CMD_PING = 30, + CL_CMD_GO = 100, + CL_CMD_GO_NORTH = 101, + CL_CMD_GO_EAST = 102, + CL_CMD_GO_SOUTH = 103, + CL_CMD_GO_WEST = 104, + CL_CMD_GO_STOP = 105, + CL_CMD_GO_NORTHEAST = 106, + CL_CMD_GO_SOUTHEAST = 107, + CL_CMD_GO_SOUTHWEST = 108, + CL_CMD_GO_NORTHWEST = 109, + CL_CMD_ROTATE_NORTH = 111, + CL_CMD_ROTATE_EAST = 112, + CL_CMD_ROTATE_SOUTH = 113, + CL_CMD_ROTATE_WEST = 114, + CL_CMD_MOVE_OBJECT = 120, + CL_CMD_TRADE_OBJECT = 125, + CL_CMD_INSPECT_TRADE = 126, + CL_CMD_ACCEPT_TRADE = 127, + CL_CMD_REJECT_TRADE = 128, + CL_CMD_USE_OBJECT = 130, + CL_CMD_USE_TWO_OBJECTS = 131, + CL_CMD_USE_ON_CREATURE = 132, + CL_CMD_TURN_OBJECT = 133, + CL_CMD_CLOSE_CONTAINER = 135, + CL_CMD_UP_CONTAINER = 136, + CL_CMD_EDIT_TEXT = 137, + CL_CMD_EDIT_LIST = 138, + CL_CMD_LOOK_AT_POINT = 140, + CL_CMD_TALK = 150, + CL_CMD_GET_CHANNELS = 151, + CL_CMD_JOIN_CHANNEL = 152, + CL_CMD_LEAVE_CHANNEL = 153, + CL_CMD_PRIVATE_CHANNEL = 154, + CL_CMD_PROCESS_REQUEST = 155, + CL_CMD_REMOVE_REQUEST = 156, + CL_CMD_CANCEL_REQUEST = 157, + CL_CMD_SET_TACTICS = 160, + CL_CMD_ATTACK = 161, + CL_CMD_FOLLOW = 162, + CL_CMD_INVITE_TO_PARTY = 163, + CL_CMD_JOIN_PARTY = 164, + CL_CMD_REVOKE_INVITATION = 165, + CL_CMD_PASS_LEADERSHIP = 166, + CL_CMD_LEAVE_PARTY = 167, + CL_CMD_OPEN_CHANNEL = 170, + CL_CMD_INVITE_TO_CHANNEL = 171, + CL_CMD_EXCLUDE_FROM_CHANNEL = 172, + CL_CMD_CANCEL = 190, + CL_CMD_REFRESH_FIELD = 201, + CL_CMD_REFRESH_CONTAINER = 202, + CL_CMD_GET_OUTFIT = 210, + CL_CMD_SET_OUTFIT = 211, + CL_CMD_ADD_BUDDY = 220, + CL_CMD_REMOVE_BUDDY = 221, + CL_CMD_BUG_REPORT = 230, + CL_CMD_RULE_VIOLATION = 231, + CL_CMD_ERROR_FILE_ENTRY = 232, +}; + +enum ServerCommand: int { + SV_CMD_INIT_GAME = 10, + SV_CMD_RIGHTS = 11, + SV_CMD_LOGIN_ERROR = 20, + SV_CMD_LOGIN_PREMIUM = 21, + SV_CMD_LOGIN_WAITINGLIST = 22, + SV_CMD_PING = 30, + SV_CMD_FULLSCREEN = 100, + SV_CMD_ROW_NORTH = 101, + SV_CMD_ROW_EAST = 102, + SV_CMD_ROW_SOUTH = 103, + SV_CMD_ROW_WEST = 104, + SV_CMD_FIELD_DATA = 105, + SV_CMD_ADD_FIELD = 106, + SV_CMD_CHANGE_FIELD = 107, + SV_CMD_DELETE_FIELD = 108, + SV_CMD_MOVE_CREATURE = 109, + SV_CMD_CONTAINER = 110, + SV_CMD_CLOSE_CONTAINER = 111, + SV_CMD_CREATE_IN_CONTAINER = 112, + SV_CMD_CHANGE_IN_CONTAINER = 113, + SV_CMD_DELETE_IN_CONTAINER = 114, + SV_CMD_SET_INVENTORY = 120, + SV_CMD_DELETE_INVENTORY = 121, + SV_CMD_TRADE_OFFER_OWN = 125, + SV_CMD_TRADE_OFFER_PARTNER = 126, + SV_CMD_CLOSE_TRADE = 127, + SV_CMD_AMBIENTE = 130, + SV_CMD_GRAPHICAL_EFFECT = 131, + SV_CMD_TEXTUAL_EFFECT = 132, + SV_CMD_MISSILE_EFFECT = 133, + SV_CMD_MARK_CREATURE = 134, + SV_CMD_CREATURE_HEALTH = 140, + SV_CMD_CREATURE_LIGHT = 141, + SV_CMD_CREATURE_OUTFIT = 142, + SV_CMD_CREATURE_SPEED = 143, + SV_CMD_CREATURE_SKULL = 144, + SV_CMD_CREATURE_PARTY = 145, + SV_CMD_EDIT_TEXT = 150, + SV_CMD_EDIT_LIST = 151, + SV_CMD_PLAYER_DATA = 160, + SV_CMD_PLAYER_SKILLS = 161, + SV_CMD_PLAYER_STATE = 162, + SV_CMD_CLEAR_TARGET = 163, + SV_CMD_TALK = 170, + SV_CMD_CHANNELS = 171, + SV_CMD_OPEN_CHANNEL = 172, + SV_CMD_PRIVATE_CHANNEL = 173, + SV_CMD_OPEN_REQUEST = 174, + SV_CMD_DELETE_REQUEST = 175, + SV_CMD_FINISH_REQUEST = 176, + SV_CMD_CLOSE_REQUEST = 177, + SV_CMD_OPEN_OWN_CHANNEL = 178, + SV_CMD_CLOSE_CHANNEL = 179, + SV_CMD_MESSAGE = 180, + SV_CMD_SNAPBACK = 181, + SV_CMD_FLOOR_UP = 190, + SV_CMD_FLOOR_DOWN = 191, + SV_CMD_OUTFIT = 200, + SV_CMD_BUDDY_DATA = 210, + SV_CMD_BUDDY_ONLINE = 211, + SV_CMD_BUDDY_OFFLINE = 212, +}; + // TODO(fusion): The maximum number of connections should probably be kept in // sync with the maximum number of communication threads, or maybe it is the // same constant. @@ -93,6 +222,7 @@ struct TConnection { TKnownCreature KnownCreatureTable[150]; }; +// connections.cc TConnection *AssignFreeConnection(void); TConnection *GetFirstConnection(void); TConnection *GetNextConnection(void); @@ -100,4 +230,82 @@ void ProcessConnections(void); void InitConnections(void); void ExitConnections(void); +// sending.cc +void SendAll(void); +bool BeginSendData(TConnection *Connection); +void FinishSendData(TConnection *Connection); +void SkipFlush(TConnection *Connection); +void SendMapObject(TConnection *Connection, Object Obj); +void SendMapPoint(TConnection *Connection, int x, int y, int z); +void SendResult(TConnection *Connection, RESULT r); +void SendRefresh(TConnection *Connection); +void SendInitGame(TConnection *Connection, uint32 CreatureID); +void SendRights(TConnection *Connection); +void SendPing(TConnection *Connection); +void SendFullScreen(TConnection *Connection); +void SendRow(TConnection *Connection, int Direction); +void SendFloors(TConnection *Connection, bool Up); +void SendFieldData(TConnection *Connection, int x, int y, int z); +void SendAddField(TConnection *Connection, int x, int y, int z, Object Obj); +void SendChangeField(TConnection *Connection, int x, int y, int z, Object Obj); +void SendDeleteField(TConnection *Connection, int x, int y, int z, Object Obj); +void SendMoveCreature(TConnection *Connection, + uint32 CreatureID, int DestX, int DestY, int DestZ); +void SendContainer(TConnection *Connection, int ContainerNr); +void SendCloseContainer(TConnection *Connection, int ContainerNr); +void SendCreateInContainer(TConnection *Connection, int ContainerNr, Object Obj); +void SendChangeInContainer(TConnection *Connection, int ContainerNr, Object Obj); +void SendDeleteInContainer(TConnection *Connection, int ContainerNr, Object Obj); +void SendBodyInventory(TConnection *Connection, uint32 CreatureID); +void SendSetInventory(TConnection *Connection, int Position, Object Obj); +void SendDeleteInventory(TConnection *Connection, int Position); +void SendTradeOffer(TConnection *Connection, const char *Name, bool OwnOffer, Object Obj); +void SendCloseTrade(TConnection *Connection); +void SendAmbiente(TConnection *Connection); +void SendGraphicalEffect(TConnection *Connection, int x, int y, int z, int Type); +void SendTextualEffect(TConnection *Connection, int x, int y, int z, int Color, const char *Text); +void SendMissileEffect(TConnection *Connection, int OrigX, int OrigY, int OrigZ, + int DestX, int DestY, int DestZ, int Type); +void SendMarkCreature(TConnection *Connection, uint32 CreatureID, int Color); +void SendCreatureHealth(TConnection *Connection, uint32 CreatureID); +void SendCreatureLight(TConnection *Connection, uint32 CreatureID); +void SendCreatureOutfit(TConnection *Connection, uint32 CreatureID); +void SendCreatureSpeed(TConnection *Connection, uint32 CreatureID); +void SendCreatureSkull(TConnection *Connection, uint32 CreatureID); +void SendCreatureParty(TConnection *Connection, uint32 CreatureID); +void SendEditText(TConnection *Connection, Object Obj); +void SendEditList(TConnection *Connection, uint8 Type, uint32 ID, const char *Text); +void SendPlayerData(TConnection *Connection); +void SendPlayerSkills(TConnection *Connection); +void SendPlayerState(TConnection *Connection, uint8 State); +void SendClearTarget(TConnection *Connection); +void SendTalk(TConnection *Connection, uint32 StatementID, + const char *Sender, int Mode, const char *Text, int Data); +void SendTalk(TConnection *Connection, uint32 StatementID, + const char *Sender, int Mode, int Channel, const char *Text); +void SendTalk(TConnection *Connection, uint32 StatementID, + const char *Sender, int Mode, int x, int y, int z, const char *Text); +void SendChannels(TConnection *Connection); +void SendOpenChannel(TConnection *Connection, int Channel); +void SendPrivateChannel(TConnection *Connection, const char *Name); +void SendOpenRequest(TConnection *Connection); +void SendDeleteRequest(TConnection *Connection, const char *Name); +void SendFinishRequest(TConnection *Connection, const char *Name); +void SendCloseRequest(TConnection *Connection); +void SendOpenOwnChannel(TConnection *Connection, int Channel); +void SendCloseChannel(TConnection *Connection, int Channel); +void SendMessage(TConnection *Connection, int Mode, const char *Text, ...) ATTR_PRINTF(3, 4); +void SendSnapback(TConnection *Connection); +void SendOutfit(TConnection *Connection); +void SendBuddyData(TConnection *Connection, uint32 CharacterID, const char *Name, bool Online); +void SendBuddyStatus(TConnection *Connection, uint32 CharacterID, bool Online); +void BroadcastMessage(int Mode, const char *Text, ...) ATTR_PRINTF(2, 3); +void DeleteGamemasterRequest(const char *Name); +void InitSending(void); +void ExitSending(void); + +// receiving.cc +void InitReceiving(void); +void ExitReceiving(void); + #endif // TIBIA_CONNECTIONS_HH_ diff --git a/src/operate.hh b/src/operate.hh index 3cb5075..85cbf9f 100644 --- a/src/operate.hh +++ b/src/operate.hh @@ -22,8 +22,6 @@ enum : int { OBJECT_MOVED = 3, }; -#if 0 -// TODO(fusion): Use these? enum : int { CHANNEL_GUILD = 0, CHANNEL_GAMEMASTER = 1, @@ -38,7 +36,6 @@ enum : int { CHANNEL_FIRST = 0, CHANNEL_LAST = 0xFFFF, }; -#endif struct TChannel { TChannel(void); diff --git a/src/sending.cc b/src/sending.cc new file mode 100644 index 0000000..52c3e28 --- /dev/null +++ b/src/sending.cc @@ -0,0 +1,1751 @@ +#include "connections.hh" +#include "config.hh" +#include "cr.hh" +#include "info.hh" +#include "map.hh" + +#include "stubs.hh" + +#include + +#define MAX_OBJECTS_PER_POINT 10 +#define MAX_OBJECTS_PER_CONTAINER 36 + +static int Skip = -1; +static TConnection *FirstSendingConnection; + +void SendAll(void){ + TConnection *Connection = FirstSendingConnection; + FirstSendingConnection = NULL; + while(Connection != NULL){ + if(Connection->WillingToSend){ + Connection->WillingToSend = false; + if(Connection->Live() && Connection->NextToCommit > Connection->NextToSend){ + kill(Connection->GetPID(), SIGUSR2); + } + }else{ + error("SendAll: Verbindung ist nicht sendewillig.\n"); + } + Connection = Connection->NextSendingConnection; + } +} + +bool BeginSendData(TConnection *Connection){ + bool Result = false; + if(Connection != NULL && Connection->Live() && Connection->State != CONNECTION_LOGIN){ + int OutDataCommitted = (Connection->NextToCommit - Connection->NextToSend); + int OutDataCapacity = (int)sizeof(Connection->OutData); + if(OutDataCommitted < OutDataCapacity){ + Connection->NextToWrite = Connection->NextToCommit; + Connection->Overflow = false; + Result = true; + }else{ + print(2, "BeginSendData: Puffer von Verbindung %d ist voll.\n", Connection->GetSocket()); + } + } + return Result; +} + +void FinishSendData(TConnection *Connection){ + if(Connection == NULL){ + error("FinishSendData: Verbindung ist NULL.\n"); + return; + } + + if(!Connection->Live()){ + error("FinishSendData: Verbindung ist nicht online.\n"); + return; + } + + if(Connection->Overflow){ + print(2, "FinishSendData: Puffer ist voll. Paket wird nicht versandt.\n"); + return; + } + + Connection->NextToCommit = Connection->NextToWrite; + if(!Connection->WillingToSend){ + Connection->WillingToSend = true; + Connection->NextSendingConnection = FirstSendingConnection; + FirstSendingConnection = Connection; + } +} + +static void SendByte(TConnection *Connection, uint8 Value){ + int OutDataWritten = (Connection->NextToWrite - Connection->NextToSend); + int OutDataCapacity = (int)sizeof(Connection->OutData); + if((OutDataWritten + 1) > OutDataCapacity){ + Connection->Overflow = true; + return; + } + + Connection->OutData[Connection->NextToWrite % OutDataCapacity] = Value; + Connection->NextToWrite += 1; +} + +static void SendWord(TConnection *Connection, uint16 Value){ + int OutDataWritten = (Connection->NextToWrite - Connection->NextToSend); + int OutDataCapacity = (int)sizeof(Connection->OutData); + if((OutDataWritten + 2) > OutDataCapacity){ + Connection->Overflow = true; + return; + } + + Connection->OutData[(Connection->NextToWrite + 0) % OutDataCapacity] = (uint8)(Value >> 0); + Connection->OutData[(Connection->NextToWrite + 1) % OutDataCapacity] = (uint8)(Value >> 8); + Connection->NextToWrite += 2; +} + +static void SendQuad(TConnection *Connection, uint32 Value){ + int OutDataWritten = (Connection->NextToWrite - Connection->NextToSend); + int OutDataCapacity = (int)sizeof(Connection->OutData); + if((OutDataWritten + 4) > OutDataCapacity){ + Connection->Overflow = true; + return; + } + + Connection->OutData[(Connection->NextToWrite + 0) % OutDataCapacity] = (uint8)(Value >> 0); + Connection->OutData[(Connection->NextToWrite + 1) % OutDataCapacity] = (uint8)(Value >> 8); + Connection->OutData[(Connection->NextToWrite + 2) % OutDataCapacity] = (uint8)(Value >> 16); + Connection->OutData[(Connection->NextToWrite + 3) % OutDataCapacity] = (uint8)(Value >> 24); + Connection->NextToWrite += 4; +} + +// NOTE(fusion): This was called `SendText` but since most these sending helpers +// were inlined, I just renamed it to something that made more sense. +static void SendBytes(TConnection *Connection, const uint8 *Buffer, int Count){ + if(Buffer == NULL){ + error("SendText: Text ist NULL.\n"); + return; + } + + if(Count <= 0){ + error("SendText: ungültige Textlänge %d.\n", Count); + return; + } + + int OutDataWritten = (Connection->NextToWrite - Connection->NextToSend); + int OutDataCapacity = (int)sizeof(Connection->OutData); + if((OutDataWritten + Count) > OutDataCapacity){ + Connection->Overflow = true; + return; + } + + int BufferStart = Connection->NextToWrite % OutDataCapacity; + int BufferEnd = BufferStart + Count; + if(BufferEnd < OutDataCapacity){ + memcpy(&Connection->OutData[BufferStart], Buffer, Count); + }else{ + int Size1 = OutDataCapacity - BufferStart; + int Size2 = BufferEnd - OutDataCapacity; + memcpy(&Connection->OutData[BufferStart], &Buffer[0], Size1); + memcpy(&Connection->OutData[0], &Buffer[Size1], Size2); + } + + Connection->NextToWrite += Count; +} + +static void SendString(TConnection *Connection, const char *String){ + if(String == NULL){ + error("SendString: String ist NULL.\n"); + return; + } + + int StringLength = (int)strlen(String); + SendWord(Connection, (uint16)StringLength); + if(StringLength > 0){ + SendBytes(Connection, (const uint8*)String, StringLength); + } +} + +static void SendOutfit(TConnection *Connection, TOutfit Outfit){ + SendWord(Connection, (uint16)Outfit.OutfitID); + if(Outfit.OutfitID == 0){ + SendWord(Connection, Outfit.ObjectType); + }else{ + SendBytes(Connection, Outfit.Colors, sizeof(Outfit.Colors)); + } +} + +static void SendItem(TConnection *Connection, Object Obj){ + ObjectType ObjType = Obj.getObjectType(); + SendWord(Connection, (uint16)ObjType.getDisguise().TypeID); + + if(ObjType.getFlag(LIQUIDCONTAINER)){ + int LiquidType = (int)Obj.getAttribute(CONTAINERLIQUIDTYPE); + SendByte(Connection, GetLiquidColor(LiquidType)); + } + + if(ObjType.getFlag(LIQUIDPOOL)){ + int LiquidType = (int)Obj.getAttribute(POOLLIQUIDTYPE); + SendByte(Connection, GetLiquidColor(LiquidType)); + } + + if(ObjType.getFlag(CUMULATIVE)){ + SendByte(Connection, (uint8)Obj.getAttribute(AMOUNT)); + } +} + +void SkipFlush(TConnection *Connection){ + while(Skip >= 0){ + int Count = std::min(Skip, UINT8_MAX); + SendByte(Connection, (uint8)Count); + SendByte(Connection, UINT8_MAX); + Skip -= (Count + 1); + } +} + +void SendMapObject(TConnection *Connection, Object Obj){ + if(!Obj.exists()){ + error("SendMapObject: Übergebenes Objekt existiert nicht.\n"); + return; + } + + if(!Obj.getObjectType().isCreatureContainer()){ + SendItem(Connection, Obj); + return; + } + + // TODO(fusion): This might also be contained in its own `SendCreature` function? + TCreature *Creature = GetCreature(Obj); + if(Creature == NULL){ + error("SendMapObject: Kreatur hat kein Kreatur-Objekt\n"); + return; + } + + KNOWNCREATURESTATE KnownState = Connection->KnownCreature(Creature->ID, true); + if(KnownState == KNOWNCREATURE_UPTODATE){ + SendWord(Connection, 99); + SendQuad(Connection, Creature->ID); + SendByte(Connection, (uint8)Creature->Direction); + }else if(KnownState == KNOWNCREATURE_OUTDATED + || KnownState == KNOWNCREATURE_FREE){ + if(KnownState == KNOWNCREATURE_FREE){ + SendWord(Connection, 97); + SendQuad(Connection, Connection->NewKnownCreature(Creature->ID)); + SendQuad(Connection, Creature->ID); + if(Creature->Type == MONSTER){ + // TODO(fusion): Apparently the monster name contains its + // article. I'm not sure it is a good idea and this probably + // lead to other bugs such as a monster having a two part name + // with no article. + const char *Name = findFirst(Creature->Name, ' '); + if(Name != NULL){ + Name += 1; + }else{ + Name = Creature->Name; + } + SendString(Connection, Name); + }else{ + SendString(Connection, Creature->Name); + } + }else{ + SendWord(Connection, 98); + SendQuad(Connection, Creature->ID); + } + + int Brightness, Color; + GetCreatureLight(Creature->ID, &Brightness, &Color); + + int PlayerkillingMark = SKULL_NONE; + int PartyMark = PARTY_SHIELD_NONE; + if(Creature->Type == PLAYER){ + TPlayer *Player = (TPlayer*)Creature; + TPlayer *Observer = Connection->GetPlayer(); + PlayerkillingMark = Player->GetPlayerkillingMark(Observer); + PartyMark = Player->GetPartyMark(Observer); + } + + SendByte(Connection, (uint8)Creature->GetHealth()); + SendByte(Connection, (uint8)Creature->Direction); + SendOutfit(Connection, Creature->Outfit); + SendByte(Connection, (uint8)Brightness); + SendByte(Connection, (uint8)Color); + SendWord(Connection, (uint16)Creature->GetSpeed()); + SendByte(Connection, (uint8)PlayerkillingMark); + SendByte(Connection, (uint8)PartyMark); + } +} + +void SendMapPoint(TConnection *Connection, int x, int y, int z){ + Object Obj = GetFirstObject(x, y, z); + if(Obj != NONE){ + SkipFlush(Connection); + int ObjCount = 0; + while(Obj != NONE && ObjCount < MAX_OBJECTS_PER_POINT){ + SendMapObject(Connection, Obj); + Obj = Obj.getNextObject(); + } + } + Skip += 1; +} + +void SendResult(TConnection *Connection, RESULT r){ + if(Connection == NULL){ + return; + } + + const char *Message = NULL; + switch(r) { + case NOERROR: error("SendResult: NOERROR\n"); break; + case NOTACCESSIBLE: Message = "Sorry, not possible."; break; + case NOTMOVABLE: Message = "You cannot move this object."; break; + case NOTTAKABLE: Message = "You cannot take this object."; break; + case NOROOM: Message = "There is not enough room."; break; + case OUTOFRANGE: Message = "Destination is out of range."; break; + case OUTOFHOME: error("SendResult: OUTOFHOME\n"); break; + case CANNOTTHROW: Message = "You cannot throw there."; break; + case TOOHEAVY: Message = "This object is too heavy."; break; + case CROSSREFERENCE: Message = "This is impossible."; break; + case CONTAINERFULL: Message = "You cannot put more objects in this container."; break; + case WRONGPOSITION: Message = "Put this object in your hand."; break; + case WRONGPOSITION2: Message = "Put this object in both hands."; break; + case WRONGCLOTHES: Message = "You cannot dress this object there."; break; + case HANDSNOTFREE: Message = "Both hands have to be free."; break; + case HANDBLOCKED: Message = "Drop the double-handed object first."; break; + case ONEWEAPONONLY: Message = "You may only use one weapon."; break; + case NOMATCH: error("SendResult: NOMATCH\n"); break; + case NOTCUMULABLE: error("SendResult: NOTCUMULABLE\n"); break; + case TOOMANYPARTS: error("SendResult: TOOMANYPARTS\n"); break; + case EMPTYCONTAINER: error("SendResult: EMPTYCONTAINER\n"); break; + case SPLITOBJECT: error("SendResult: SPLITOBJECT\n"); break; + case NOKEYMATCH: Message = "The key does not match."; break; + case UPSTAIRS: Message = "First go upstairs."; break; + case DOWNSTAIRS: Message = "First go downstairs."; break; + case CREATURENOTEXISTING: Message = "A creature with this name does not exist."; break; + case PLAYERNOTEXISTING: Message = "A player with this name does not exist."; break; + case PLAYERNOTONLINE: Message = "A player with this name is not online."; break; + case NAMEAMBIGUOUS: Message = "Playername is ambiguous."; break; + case NOTUSABLE: Message = "You cannot use this object."; break; + case FEDUP: Message = "You are full."; break; + case SPELLUNKNOWN: Message = "You must learn this spell first."; break; + case LOWMAGICLEVEL: Message = "Your magic level is too low."; break; + case MAGICITEM: Message = "A magic item is necessary to cast this spell."; break; + case NOTENOUGHMANA: Message = "You do not have enough mana."; break; + case NOSKILL: error("SendResult: NOSKILL\n"); break; + case TARGETLOST: Message = "Target lost."; break; + case NOCREATURE: Message = "You can only use this rune on creatures."; break; + case TOOLONG: error("SendResult: TOOLONG\n"); break; + case ATTACKNOTALLOWED: Message = "You may not attack this person."; break; + case NOWAY: Message = "There is no way."; break; + case LOGINERROR: Message = "An error occured while logging in."; break; + case PROTECTIONZONE: Message = "This action is not permitted in a protection zone."; break; + case ENTERPROTECTIONZONE: Message = "Characters who attacked other players may not enter a protection zone."; break; + case EXHAUSTED: Message = "You are exhausted."; break; + case NOTINVITED: Message = "You are not invited."; break; + case NOPREMIUMACCOUNT: Message = "You need a premium account."; break; + case MOVENOTPOSSIBLE: Message = "Sorry, not possible."; break; + case ALREADYTRADING: Message = "You are already trading. Finish this trade first."; break; + case PARTNERTRADING: Message = "This person is already trading."; break; + case TOOMANYOBJECTS: Message = "You can only trade up to 100 objects at one time."; break; + case TOOMANYSLAVES: Message = "You cannot control more creatures."; break; + case NOTTURNABLE: Message = "You cannot turn this object."; break; + case SECUREMODE: Message = "Turn secure mode off if you really want to attack unmarked players."; break; + case NOTENOUGHSOULPOINTS: Message = "You do not have enough soulpoints."; break; + case LOWLEVEL: Message = "Your level is too low."; break; + default: break; + } + + if(Message != NULL){ + if(r == ENTERPROTECTIONZONE || r == NOTINVITED || r == MOVENOTPOSSIBLE){ + SendSnapback(Connection); + } + SendMessage(Connection, TALK_FAILURE_MESSAGE, "Sorry, not possible."); + } +} + +void SendRefresh(TConnection *Connection){ + SendFullScreen(Connection); + SendAmbiente(Connection); + SendPlayerData(Connection); + SendPlayerSkills(Connection); +} + +void SendInitGame(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_INIT_GAME); + SendQuad(Connection, CreatureID); + SendWord(Connection, (uint16)Beat); + SendByte(Connection, CheckRight(CreatureID, SEND_BUGREPORTS) ? 1 : 0); + FinishSendData(Connection); +} + +void SendRights(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_RIGHTS); + + // NOTE(fusion): See `CheckBanishmentRight`. + bool Count = 0; + for(int Reason = 0; Reason <= 31; Reason += 1){ + uint8 Actions = 0; + if(CheckRight(Connection->CharacterID, (RIGHT)(Reason + 18))){ + for(int Action = 0; Action <= 6; Action += 1){ + if(CheckBanishmentRight(Connection->CharacterID, Reason, Action)){ + Actions |= (1 << Action); + } + } + + if(Actions != 0){ + if(CheckRight(Connection->CharacterID, IP_BANISHMENT)){ + Actions |= 0x80; + } + Count += 1; + } + } + + SendByte(Connection, Actions); + } + + if(Count > 0){ + FinishSendData(Connection); + } +} + +void SendPing(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_PING); + FinishSendData(Connection); +} + +void SendFullScreen(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + int PlayerX, PlayerY, PlayerZ; + Connection->GetPosition(&PlayerX, &PlayerY, &PlayerZ); + int MinX = PlayerX - Connection->TerminalOffsetX; + int MinY = PlayerY - Connection->TerminalOffsetY; + int MaxX = MinX + Connection->TerminalWidth - 1; + int MaxY = MinY + Connection->TerminalHeight - 1; + + // NOTE(fusion): `EndZ` is exclusive. + int StartZ, EndZ, StepZ; + if(PlayerZ <= 7){ + StepZ = -1; + StartZ = 7; + EndZ = 0 + StepZ; + }else{ + StepZ = 1; + StartZ = PlayerZ - 2; + EndZ = std::min(PlayerZ + 2, 15) + StepZ; + } + + SendByte(Connection, SV_CMD_FULLSCREEN); + SendWord(Connection, (uint16)PlayerX); + SendWord(Connection, (uint16)PlayerY); + SendByte(Connection, (uint8)PlayerZ); + + Skip = -1; + for(int PointZ = StartZ; PointZ != EndZ; EndZ += StepZ){ + int ZOffset = (PlayerZ - PointZ); + for(int PointX = MinX; PointX <= MaxX; PointX += 1) + for(int PointY = MinY; PointY <= MaxY; PointY += 1){ + SendMapPoint(Connection, PointX + ZOffset, PointY + ZOffset, PlayerZ); + } + } + SkipFlush(Connection); + + FinishSendData(Connection); +} + +void SendRow(TConnection *Connection, int Direction){ + if(!BeginSendData(Connection)){ + return; + } + + int PlayerX, PlayerY, PlayerZ; + Connection->GetPosition(&PlayerX, &PlayerY, &PlayerZ); + int MinX = PlayerX - Connection->TerminalOffsetX; + int MinY = PlayerY - Connection->TerminalOffsetY; + int MaxX = MinX + Connection->TerminalWidth - 1; + int MaxY = MinY + Connection->TerminalHeight - 1; + + // NOTE(fusion): `EndZ` is exclusive. + int StartZ, EndZ, StepZ; + if(PlayerZ <= 7){ + StepZ = -1; + StartZ = 7; + EndZ = 0 + StepZ; + }else{ + StepZ = 1; + StartZ = PlayerZ - 2; + EndZ = std::min(PlayerZ + 2, 15) + StepZ; + } + + if(Direction == DIRECTION_NORTH){ + SendByte(Connection, SV_CMD_ROW_NORTH); + MaxY = MinY; + }else if(Direction == DIRECTION_EAST){ + SendByte(Connection, SV_CMD_ROW_EAST); + MinX = MaxX; + }else if(Direction == DIRECTION_SOUTH){ + SendByte(Connection, SV_CMD_ROW_SOUTH); + MinY = MaxY; + }else if(Direction == DIRECTION_WEST){ + SendByte(Connection, SV_CMD_ROW_WEST); + MaxX = MinX; + }else{ + error("SendRow: Ungültige Richtungsangabe %d.\n", Direction); + return; + } + + Skip = -1; + for(int PointZ = StartZ; PointZ != EndZ; EndZ += StepZ){ + int ZOffset = (PlayerZ - PointZ); + for(int PointX = MinX; PointX <= MaxX; PointX += 1) + for(int PointY = MinY; PointY <= MaxY; PointY += 1){ + SendMapPoint(Connection, PointX + ZOffset, PointY + ZOffset, PlayerZ); + } + } + SkipFlush(Connection); + + FinishSendData(Connection); +} + +void SendFloors(TConnection *Connection, bool Up){ + if(!BeginSendData(Connection)){ + return; + } + + int PlayerX, PlayerY, PlayerZ; + Connection->GetPosition(&PlayerX, &PlayerY, &PlayerZ); + + // NOTE(fusion): `EndZ` is exclusive. + int StartZ = -1; + int EndZ = -1; + int StepZ = 0; + if(Up){ + SendByte(Connection, SV_CMD_FLOOR_UP); + if(PlayerZ == 7){ + // NOTE(fusion): Going to surface (8 -> 7). The client currently has + // floors [10, 6] so we only need to send floors [5, 0]. + StepZ = -1; + StartZ = 5; + EndZ = 0 + StepZ; + }else if(PlayerZ > 7){ + // NOTE(fusion): Going up but still underground. Send next floor up. + StepZ = -1; + StartZ = PlayerZ - 2; + EndZ = StartZ + StepZ; + } + }else{ + SendByte(Connection, SV_CMD_FLOOR_DOWN); + if(PlayerZ == 8){ + // NOTE(fusion): Going underground (7 -> 8). The client currently has + // floors [7, 0] so we only need to send floors [10, 8]. + StepZ = 1; + StartZ = 8; + EndZ = 10 + StepZ; + }else if(PlayerZ > 8 && (PlayerZ + 2) <= 15){ + // NOTE(fusion): Going down while underground. Send next floor down + // if it exists. + StepZ = 1; + StartZ = PlayerZ + 2; + EndZ = StartZ + StepZ; + } + } + + if(StartZ != EndZ){ + int MinX = PlayerX - Connection->TerminalOffsetX; + int MinY = PlayerY - Connection->TerminalOffsetY; + int MaxX = MinX + Connection->TerminalWidth - 1; + int MaxY = MinY + Connection->TerminalHeight - 1; + + Skip = -1; + for(int PointZ = StartZ; PointZ != EndZ; EndZ += StepZ){ + int ZOffset = (PlayerZ - PointZ); + for(int PointX = MinX; PointX <= MaxX; PointX += 1) + for(int PointY = MinY; PointY <= MaxY; PointY += 1){ + SendMapPoint(Connection, PointX + ZOffset, PointY + ZOffset, PlayerZ); + } + } + SkipFlush(Connection); + } + + FinishSendData(Connection); +} + +void SendFieldData(TConnection *Connection, int x, int y, int z){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_FIELD_DATA); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + + Skip = -1; + SendMapPoint(Connection, x, y, z); + SkipFlush(Connection); + + FinishSendData(Connection); +} + +void SendAddField(TConnection *Connection, int x, int y, int z, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendAddField: Übergebenes Objekt existiert nicht.\n"); + return; + } + + SendByte(Connection, SV_CMD_ADD_FIELD); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + SendMapObject(Connection, Obj); + FinishSendData(Connection); +} + +void SendChangeField(TConnection *Connection, int x, int y, int z, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendChangeField: Übergebenes Objekt existiert nicht.\n"); + return; + } + + int ObjIndex = GetObjectRNum(Obj); + if(ObjIndex < MAX_OBJECTS_PER_POINT){ + SendByte(Connection, SV_CMD_CHANGE_FIELD); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + SendByte(Connection, (uint8)ObjIndex); + SendMapObject(Connection, Obj); + FinishSendData(Connection); + } +} + +void SendDeleteField(TConnection *Connection, int x, int y, int z, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendDeleteField: Übergebenes Objekt existiert nicht.\n"); + return; + } + + int ObjIndex = GetObjectRNum(Obj); + if(ObjIndex < MAX_OBJECTS_PER_POINT){ + SendByte(Connection, SV_CMD_DELETE_FIELD); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + SendByte(Connection, (uint8)ObjIndex); + FinishSendData(Connection); + } +} + +void SendMoveCreature(TConnection *Connection, + uint32 CreatureID, int DestX, int DestY, int DestZ){ + if(Connection == NULL){ + return; + } + + TCreature *Creature = GetCreature(CreatureID); + if(Creature == NULL){ + error("SendMoveCreature: Kreatur existiert nicht.\n"); + return; + } + + int OrigX = Creature->posx; + int OrigY = Creature->posy; + int OrigZ = Creature->posz; + int OrigIndex = GetObjectRNum(Creature->CrObject); + bool IsVisible = Connection->IsVisible(DestX, DestY, DestZ); + bool WasVisible = OrigIndex < MAX_OBJECTS_PER_POINT + && Connection->IsVisible(OrigX, OrigY, OrigZ); + if(IsVisible && WasVisible){ + if(BeginSendData(Connection)){ + SendByte(Connection, SV_CMD_MOVE_CREATURE); + SendWord(Connection, (uint16)OrigX); + SendWord(Connection, (uint16)OrigY); + SendByte(Connection, (uint8)OrigZ); + SendByte(Connection, (uint8)OrigIndex); + SendWord(Connection, (uint16)DestX); + SendWord(Connection, (uint16)DestY); + SendByte(Connection, (uint8)DestZ); + FinishSendData(Connection); + } + }else if(IsVisible){ + SendAddField(Connection, DestX, DestY, DestZ, Creature->CrObject); + }else if(WasVisible){ + SendDeleteField(Connection, OrigX, OrigY, OrigZ, Creature->CrObject); + } +} + +void SendContainer(TConnection *Connection, int ContainerNr){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + error("SendContainer: Zu dieser Verbindung gehört kein Spieler.\n"); + return; + } + + Object Con = Player->GetOpenContainer(ContainerNr); + if(!Con.exists()){ + error("SendContainer: Container %d existiert nicht.\n", ContainerNr); + return; + } + + ObjectType ConType = Con.getObjectType(); + bool HasUpContainer = (Con.getContainer() != NONE + && !Con.getContainer().getObjectType().isBodyContainer()); + + int ConObjects = CountObjectsInContainer(Con); + if(ConObjects > MAX_OBJECTS_PER_CONTAINER){ + ConObjects = MAX_OBJECTS_PER_CONTAINER; + } + + SendByte(Connection, SV_CMD_CONTAINER); + SendByte(Connection, (uint8)ContainerNr); + SendWord(Connection, (uint16)ConType.getDisguise().TypeID); + SendString(Connection, ConType.getName(-1)); + SendByte(Connection, (uint8)ConType.getAttribute(CAPACITY)); + SendByte(Connection, HasUpContainer ? 1 : 0); + SendByte(Connection, (uint8)ConObjects); + + Object Obj = GetFirstContainerObject(Con); + while(Obj != NONE && ConObjects > 0){ + SendItem(Connection, Obj); + Obj = Obj.getNextObject(); + ConObjects -= 1; + } + + FinishSendData(Connection); +} + +void SendCloseContainer(TConnection *Connection, int ContainerNr){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_CLOSE_CONTAINER); + SendByte(Connection, (uint8)ContainerNr); + FinishSendData(Connection); +} + +void SendCreateInContainer(TConnection *Connection, int ContainerNr, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_CREATE_IN_CONTAINER); + SendByte(Connection, (uint8)ContainerNr); + SendItem(Connection, Obj); + FinishSendData(Connection); +} + +void SendChangeInContainer(TConnection *Connection, int ContainerNr, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendChangeInContainer: Übergebenes Objekt existiert nicht.\n"); + return; + } + + int ObjIndex = GetObjectRNum(Obj); + if(ObjIndex < MAX_OBJECTS_PER_CONTAINER){ + SendByte(Connection, SV_CMD_CHANGE_IN_CONTAINER); + SendByte(Connection, (uint8)ContainerNr); + SendByte(Connection, (uint8)ObjIndex); + SendItem(Connection, Obj); + FinishSendData(Connection); + } +} + +void SendDeleteInContainer(TConnection *Connection, int ContainerNr, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendDeleteInContainer: Übergebenes Objekt existiert nicht.\n"); + return; + } + + int ObjIndex = GetObjectRNum(Obj); + if(ObjIndex < MAX_OBJECTS_PER_CONTAINER){ + SendByte(Connection, SV_CMD_DELETE_IN_CONTAINER); + SendByte(Connection, (uint8)ContainerNr); + SendByte(Connection, (uint8)ObjIndex); + FinishSendData(Connection); + } +} + +void SendBodyInventory(TConnection *Connection, uint32 CreatureID){ + for(int Position = INVENTORY_FIRST; + Position <= INVENTORY_LAST; + Position += 1){ + Object Obj = GetBodyObject(CreatureID, Position); + if(Obj != NONE){ + SendSetInventory(Connection, Position, Obj); + } + } +} + +void SendSetInventory(TConnection *Connection, int Position, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendSetInventory: Objekt existiert nicht.\n"); + return; + } + + SendByte(Connection, SV_CMD_SET_INVENTORY); + SendByte(Connection, (uint8)Position); + SendItem(Connection, Obj); + FinishSendData(Connection); +} + +void SendDeleteInventory(TConnection *Connection, int Position){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_DELETE_INVENTORY); + SendByte(Connection, (uint8)Position); + FinishSendData(Connection); +} + +static void SendTradeObjects(TConnection *Connection, Object Obj){ + if(!Obj.exists()){ + return; + } + + SendItem(Connection, Obj); + if(Obj.getObjectType().getFlag(CONTAINER)){ + Object Help = GetFirstContainerObject(Obj); + while(Help != NONE){ + SendTradeObjects(Connection, Help); + Help = Help.getNextObject(); + } + } +} + +void SendTradeOffer(TConnection *Connection, const char *Name, bool OwnOffer, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(Name == NULL){ + error("SendTradeOffer: Name ist NULL.\n"); + return; + } + + if(!Obj.exists()){ + error("SendTradeOffer: Objekt existiert nicht.\n"); + return; + } + + int ObjCount = CountObjects(Obj); + if(ObjCount > UINT8_MAX){ + error("SendTradeOffer: Too many objects.\n"); + return; + } + + if(OwnOffer){ + SendByte(Connection, SV_CMD_TRADE_OFFER_OWN); + }else{ + SendByte(Connection, SV_CMD_TRADE_OFFER_PARTNER); + } + + SendString(Connection, Name); + SendByte(Connection, (uint8)ObjCount); + SendTradeObjects(Connection, Obj); + FinishSendData(Connection); +} + +void SendCloseTrade(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_CLOSE_TRADE); + FinishSendData(Connection); +} + +void SendAmbiente(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + int Brightness, Color; + GetAmbiente(&Brightness, &Color); + + SendByte(Connection, SV_CMD_AMBIENTE); + SendByte(Connection, (uint8)Brightness); + SendByte(Connection, (uint8)Color); + FinishSendData(Connection); +} + +void SendGraphicalEffect(TConnection *Connection, int x, int y, int z, int Type){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_GRAPHICAL_EFFECT); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + SendByte(Connection, (uint8)Type); + FinishSendData(Connection); +} + +void SendTextualEffect(TConnection *Connection, int x, int y, int z, int Color, const char *Text){ + if(Text == NULL){ + error("SendTextualEffect: Text ist NULL.\n"); + return; + } + + if(Text[0] == 0){ + error("SendTextualEffect: Text ist leer.\n"); + return; + } + + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_TEXTUAL_EFFECT); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + SendByte(Connection, (uint8)Color); + SendString(Connection, Text); + FinishSendData(Connection); +} + +void SendMissileEffect(TConnection *Connection, int OrigX, int OrigY, int OrigZ, + int DestX, int DestY, int DestZ, int Type){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_MISSILE_EFFECT); + SendWord(Connection, (uint16)OrigX); + SendWord(Connection, (uint16)OrigY); + SendByte(Connection, (uint8)OrigZ); + SendWord(Connection, (uint16)DestX); + SendWord(Connection, (uint16)DestY); + SendByte(Connection, (uint8)DestZ); + SendByte(Connection, (uint8)Type); + FinishSendData(Connection); +} + +void SendMarkCreature(TConnection *Connection, uint32 CreatureID, int Color){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_MARK_CREATURE); + SendQuad(Connection, CreatureID); + SendByte(Connection, (uint8)Color); + FinishSendData(Connection); +} + +void SendCreatureHealth(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + TCreature *Creature = GetCreature(CreatureID); + if(Creature == NULL){ + error("SendCreatureHealth: Kreatur %u existiert nicht.\n", CreatureID); + return; + } + + SendByte(Connection, SV_CMD_CREATURE_HEALTH); + SendQuad(Connection, CreatureID); + SendByte(Connection, (uint8)Creature->GetHealth()); + FinishSendData(Connection); +} + +void SendCreatureLight(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + TCreature *Creature = GetCreature(CreatureID); + if(Creature == NULL){ + error("SendCreatureLight: Kreatur %u existiert nicht.\n", CreatureID); + return; + } + + int Brightness, Color; + GetCreatureLight(CreatureID, &Brightness, &Color); + + SendByte(Connection, SV_CMD_CREATURE_LIGHT); + SendQuad(Connection, CreatureID); + SendByte(Connection, (uint8)Brightness); + SendByte(Connection, (uint8)Color); + FinishSendData(Connection); +} + +void SendCreatureOutfit(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + TCreature *Creature = GetCreature(CreatureID); + if(Creature == NULL){ + error("SendCreatureOutfit: Kreatur %u existiert nicht.\n", CreatureID); + return; + } + + SendByte(Connection, SV_CMD_CREATURE_OUTFIT); + SendQuad(Connection, CreatureID); + SendOutfit(Connection, Creature->Outfit); + FinishSendData(Connection); +} + +void SendCreatureSpeed(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + TCreature *Creature = GetCreature(CreatureID); + if(Creature == NULL){ + error("SendCreatureSpeed: Kreatur %u existiert nicht.\n", CreatureID); + return; + } + + SendByte(Connection, SV_CMD_CREATURE_SPEED); + SendQuad(Connection, CreatureID); + SendWord(Connection, (uint16)Creature->GetSpeed()); + FinishSendData(Connection); +} + +void SendCreatureSkull(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = GetPlayer(CreatureID); + if(Player == NULL){ + error("SendCreatureSkull: Kreatur %u existiert nicht.\n", CreatureID); + return; + } + + SendByte(Connection, SV_CMD_CREATURE_SKULL); + SendQuad(Connection, CreatureID); + SendByte(Connection, Player->GetPlayerkillingMark(Connection->GetPlayer())); + FinishSendData(Connection); +} + +void SendCreatureParty(TConnection *Connection, uint32 CreatureID){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = GetPlayer(CreatureID); + if(Player == NULL){ + error("SendCreatureParty: Kreatur %u existiert nicht.\n", CreatureID); + return; + } + + SendByte(Connection, SV_CMD_CREATURE_PARTY); + SendQuad(Connection, CreatureID); + SendByte(Connection, Player->GetPartyMark(Connection->GetPlayer())); + FinishSendData(Connection); +} + +void SendEditText(TConnection *Connection, Object Obj){ + if(!BeginSendData(Connection)){ + return; + } + + if(!Obj.exists()){ + error("SendEditText: Übergebenes Objekt existiert nicht.\n"); + return; + } + + ObjectType ObjType = Obj.getObjectType(); + int TypeID = ObjType.getDisguise().TypeID; + int MaxLength = 0; + const char *Text = NULL; + const char *Editor = NULL; + char SpellbookBuffer[4096] = {}; + if(ObjType.getFlag(WRITE) || ObjType.getFlag(WRITEONCE)){ + MaxLength = (ObjType.getFlag(WRITE) + ? ObjType.getAttribute(MAXLENGTH) + : ObjType.getAttribute(MAXLENGTHONCE)); + MaxLength -= 1; + Text = GetDynamicString(Obj.getAttribute(TEXTSTRING)); + Editor = GetDynamicString(Obj.getAttribute(EDITOR)); + }else if(ObjType.getFlag(INFORMATION) + && ObjType.getAttribute(INFORMATIONTYPE) == 4){ // INFORMATION_SPELLBOOK ? + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + error("SendEditText: Zu dieser Verbindung gehört kein Spieler.\n"); + return; + } + + GetSpellbook(Player->ID, SpellbookBuffer); + Text = SpellbookBuffer; + MaxLength = strlen(Text); + }else{ + Text = GetDynamicString(Obj.getAttribute(TEXTSTRING)); + Editor = GetDynamicString(Obj.getAttribute(EDITOR)); + if(Text != NULL){ + MaxLength = strlen(Text); + } + } + + SendByte(Connection, SV_CMD_EDIT_TEXT); + SendQuad(Connection, Obj.ObjectID); + SendWord(Connection, (uint16)TypeID); + SendWord(Connection, (uint16)MaxLength); + if(Text != NULL){ + SendString(Connection, Text); + SendString(Connection, (Editor != NULL ? Editor : "")); + }else{ + SendString(Connection, ""); + SendString(Connection, ""); + } + + FinishSendData(Connection); +} + +void SendEditList(TConnection *Connection, uint8 Type, uint32 ID, const char *Text){ + if(!BeginSendData(Connection)){ + return; + } + + if(Text == NULL){ + error("SendEditList: Text ist NULL.\n"); + return; + } + + if(strlen(Text) >= 4000){ + error("SendEditList: Text ist zu lang.\n"); + return; + } + + SendByte(Connection, SV_CMD_EDIT_LIST); + SendByte(Connection, Type); + SendQuad(Connection, ID); + SendString(Connection, Text); + FinishSendData(Connection); +} + +void SendPlayerData(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + error("SendStatus: Zu dieser Verbindung gehört kein Spieler.\n"); + return; + } + + // TODO(fusion): I don't even think skills can even be NULL. + int Level = 0; + int LevelPercent = 0; + int Experience = 0; + int MagicLevel = 0; + int MagicLevelPercent = 0; + int HitPoints = 0; + int MaxHitPoints = 0; + int ManaPoints = 0; + int MaxManaPoints = 0; + int Capacity = 0; + int SoulPoints = 0; + + if(Player->Skills[SKILL_LEVEL] != NULL){ + Level = Player->Skills[SKILL_LEVEL]->Get(); + LevelPercent = Player->Skills[SKILL_LEVEL]->GetProgress(); + Experience = Player->Skills[SKILL_LEVEL]->Exp; + } + + if(Player->Skills[SKILL_MAGIC_LEVEL] != NULL){ + MagicLevel = Player->Skills[SKILL_MAGIC_LEVEL]->Get(); + MagicLevelPercent = Player->Skills[SKILL_MAGIC_LEVEL]->GetProgress(); + } + + if(Player->Skills[SKILL_HITPOINTS] != NULL){ + HitPoints = Player->Skills[SKILL_HITPOINTS]->Get(); + MaxHitPoints = Player->Skills[SKILL_HITPOINTS]->Max; + } + + if(Player->Skills[SKILL_MANA] != NULL){ + ManaPoints = Player->Skills[SKILL_MANA]->Get(); + MaxManaPoints = Player->Skills[SKILL_MANA]->Max; + } + + if(Player->Skills[SKILL_CARRY_STRENGTH] != NULL + && !CheckRight(Player->ID, ZERO_CAPACITY)){ + int InventoryWeight = GetInventoryWeight(Player->ID); + int MaxWeight = Player->Skills[SKILL_CARRY_STRENGTH]->Get() * 100; + Capacity = (MaxWeight - InventoryWeight) / 100; + } + + if(Player->Skills[SKILL_SOUL] != NULL){ + SoulPoints = Player->Skills[SKILL_SOUL]->Get(); + } + + SendByte(Connection, SV_CMD_PLAYER_DATA); + SendWord(Connection, (uint16)HitPoints); + SendWord(Connection, (uint16)MaxHitPoints); + SendWord(Connection, (uint16)Capacity); + SendQuad(Connection, (uint32)Experience); + SendWord(Connection, (uint16)Level); + SendByte(Connection, (uint8)LevelPercent); + SendWord(Connection, (uint16)ManaPoints); + SendWord(Connection, (uint16)MaxManaPoints); + SendByte(Connection, (uint8)MagicLevel); + SendByte(Connection, (uint8)MagicLevelPercent); + SendByte(Connection, (uint8)SoulPoints); + FinishSendData(Connection); +} + +void SendPlayerSkills(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + error("SendPlayerSkills: Zu dieser Verbindung gehört kein Spieler.\n"); + return; + } + + // TODO(fusion): I don't even think skills can even be NULL. + int FistLevel = 0; + int FistPercent = 0; + int ClubLevel = 0; + int ClubPercent = 0; + int SwordLevel = 0; + int SwordPercent = 0; + int AxeLevel = 0; + int AxePercent = 0; + int DistanceLevel = 0; + int DistancePercent = 0; + int ShieldingLevel = 0; + int ShieldingPercent = 0; + int FishingLevel = 0; + int FishingPercent = 0; + + if(Player->Skills[SKILL_FIST] != NULL){ + FistLevel = Player->Skills[SKILL_FIST]->Get(); + FistPercent = Player->Skills[SKILL_FIST]->GetProgress(); + } + + if(Player->Skills[SKILL_CLUB] != NULL){ + ClubLevel = Player->Skills[SKILL_CLUB]->Get(); + ClubPercent = Player->Skills[SKILL_CLUB]->GetProgress(); + } + + if(Player->Skills[SKILL_SWORD] != NULL){ + SwordLevel = Player->Skills[SKILL_SWORD]->Get(); + SwordPercent = Player->Skills[SKILL_SWORD]->GetProgress(); + } + + if(Player->Skills[SKILL_AXE] != NULL){ + AxeLevel = Player->Skills[SKILL_AXE]->Get(); + AxePercent = Player->Skills[SKILL_AXE]->GetProgress(); + } + + if(Player->Skills[SKILL_DISTANCE] != NULL){ + DistanceLevel = Player->Skills[SKILL_DISTANCE]->Get(); + DistancePercent = Player->Skills[SKILL_DISTANCE]->GetProgress(); + } + + if(Player->Skills[SKILL_SHIELDING] != NULL){ + ShieldingLevel = Player->Skills[SKILL_SHIELDING]->Get(); + ShieldingPercent = Player->Skills[SKILL_SHIELDING]->GetProgress(); + } + + if(Player->Skills[SKILL_FISHING] != NULL){ + FishingLevel = Player->Skills[SKILL_FISHING]->Get(); + FishingPercent = Player->Skills[SKILL_FISHING]->GetProgress(); + } + + SendByte(Connection, SV_CMD_PLAYER_SKILLS); + SendByte(Connection, (uint8)FistLevel); + SendByte(Connection, (uint8)FistPercent); + SendByte(Connection, (uint8)ClubLevel); + SendByte(Connection, (uint8)ClubPercent); + SendByte(Connection, (uint8)SwordLevel); + SendByte(Connection, (uint8)SwordPercent); + SendByte(Connection, (uint8)AxeLevel); + SendByte(Connection, (uint8)AxePercent); + SendByte(Connection, (uint8)DistanceLevel); + SendByte(Connection, (uint8)DistancePercent); + SendByte(Connection, (uint8)ShieldingLevel); + SendByte(Connection, (uint8)ShieldingPercent); + SendByte(Connection, (uint8)FishingLevel); + SendByte(Connection, (uint8)FishingPercent); + FinishSendData(Connection); +} + +void SendPlayerState(TConnection *Connection, uint8 State){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_PLAYER_STATE); + SendByte(Connection, State); + FinishSendData(Connection); +} + +void SendClearTarget(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_CLEAR_TARGET); + FinishSendData(Connection); +} + +void SendTalk(TConnection *Connection, uint32 StatementID, + const char *Sender, int Mode, const char *Text, int Data){ + if(Mode != TALK_PRIVATE_MESSAGE + && Mode != TALK_GAMEMASTER_REQUEST + && Mode != TALK_GAMEMASTER_ANSWER + && Mode != TALK_PLAYER_ANSWER + && Mode != TALK_GAMEMASTER_BROADCAST + && Mode != TALK_GAMEMASTER_MESSAGE){ + error("SendTalk (-): Ungültiger Modus %d.\n", Mode); + return; + } + + if(Sender == NULL){ + error("SendTalk (-): Sender ist NULL.\n"); + return; + } + + if(Text == NULL){ + error("SendTalk (-): Text ist NULL.\n"); + return; + } + + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_TALK); + SendQuad(Connection, StatementID); + SendString(Connection, Sender); + SendByte(Connection, (uint8)Mode); + if(Mode == TALK_GAMEMASTER_REQUEST){ + SendQuad(Connection, (uint32)Data); + } + SendString(Connection, Text); + FinishSendData(Connection); +} + +void SendTalk(TConnection *Connection, uint32 StatementID, + const char *Sender, int Mode, int Channel, const char *Text){ + if(Mode != TALK_CHANNEL_CALL + && Mode != TALK_GAMEMASTER_CHANNELCALL + && Mode != TALK_HIGHLIGHT_CHANNELCALL + && Mode != TALK_ANONYMOUS_CHANNELCALL){ + error("SendTalk (C): Ungültiger Modus %d.\n", Mode); + return; + } + + if(Sender == NULL){ + error("SendTalk (C): Sender ist NULL.\n"); + return; + } + + if(Text == NULL){ + error("SendTalk (C): Text ist NULL.\n"); + return; + } + + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_TALK); + SendQuad(Connection, StatementID); + if(Mode != TALK_ANONYMOUS_CHANNELCALL){ + SendString(Connection, Sender); + }else{ + SendString(Connection, ""); + } + SendByte(Connection, (uint8)Mode); + SendWord(Connection, (uint16)Channel); + SendString(Connection, Text); + FinishSendData(Connection); +} + +void SendTalk(TConnection *Connection, uint32 StatementID, + const char *Sender, int Mode, int x, int y, int z, const char *Text){ + if(Mode != TALK_SAY + && Mode != TALK_WHISPER + && Mode != TALK_YELL + && Mode != TALK_ANIMAL_LOW + && Mode != TALK_ANIMAL_LOUD){ + error("SendTalk: Ungültiger Modus %d.\n", Mode); + return; + } + + if(Sender == NULL){ + error("SendTalk (K): Sender ist NULL.\n"); + return; + } + + if(Text == NULL){ + error("SendTalk (K): Text ist NULL.\n"); + return; + } + + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_TALK); + SendQuad(Connection, StatementID); + SendString(Connection, Sender); + SendByte(Connection, (uint8)Mode); + SendWord(Connection, (uint16)x); + SendWord(Connection, (uint16)y); + SendByte(Connection, (uint8)z); + SendString(Connection, Text); + FinishSendData(Connection); +} + +void SendChannels(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + return; + } + + int Channels = GetNumberOfChannels(); + bool OwnChannel = MayOpenChannel(Player->ID); + int NumAvailable = 0; + bool *Available = (bool*)alloca(Channels * sizeof(bool)); + for(int Channel = 0; Channel < Channels; Channel += 1){ + Available[Channel] = ChannelAvailable(Channel, Player->ID); + if(Available[Channel]){ + NumAvailable += 1; + } + } + + if(OwnChannel){ + NumAvailable += 1; + } + + // TODO(fusion): The original function wouldn't limit the maximum number + // of available channels. It is unlikely any player would be invited to + // more channels than an uint8 can hold but there is no reason not to + // maintain packet coherency. If this value wraps and we still add all + // available channels, the whole packet will get dropped and I'm not sure + // but the client may also assert. + if(NumAvailable > UINT8_MAX){ + NumAvailable = UINT8_MAX; + } + + SendByte(Connection, SV_CMD_CHANNELS); + SendByte(Connection, (uint8)NumAvailable); + + if(OwnChannel){ + SendWord(Connection, 0xFFFF); + SendString(Connection, "Private Chat Channel"); + NumAvailable -= 1; + } + + for(int Channel = 0; Channel < Channels; Channel += 1){ + if(NumAvailable <= 0){ + break; + } + + if(Available[Channel]){ + SendWord(Connection, (uint16)Channel); + SendString(Connection, GetChannelName(Channel, Player->ID)); + NumAvailable -= 1; + } + } + + FinishSendData(Connection); +} + +void SendOpenChannel(TConnection *Connection, int Channel){ + if(!BeginSendData(Connection)){ + return; + } + + if(Channel == CHANNEL_RULEVIOLATIONS){ + error("SendOpenChannel: Kanal ist GM-Request-Queue.\n"); + return; + } + + if(Channel < 0 || Channel >= GetNumberOfChannels()){ + error("SendOpenChannel: Ungültiger Kanal %d.\n", Channel); + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + return; + } + + SendByte(Connection, SV_CMD_OPEN_CHANNEL); + SendWord(Connection, (uint16)Channel); + SendString(Connection, GetChannelName(Channel, Player->ID)); + FinishSendData(Connection); +} + +void SendPrivateChannel(TConnection *Connection, const char *Name){ + if(!BeginSendData(Connection)){ + return; + } + + if(Name == NULL){ + error("SendPrivateChannel: Name ist NULL.\n"); + return; + } + + SendByte(Connection, SV_CMD_PRIVATE_CHANNEL); + SendString(Connection, Name); + FinishSendData(Connection); +} + +void SendOpenRequest(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_OPEN_REQUEST); + SendWord(Connection, (uint16)CHANNEL_RULEVIOLATIONS); + FinishSendData(Connection); +} + +void SendDeleteRequest(TConnection *Connection, const char *Name){ + if(!BeginSendData(Connection)){ + return; + } + + if(Name == NULL){ + error("SendDeleteRequest: Name ist NULL.\n"); + return; + } + + SendByte(Connection, SV_CMD_DELETE_REQUEST); + SendString(Connection, Name); + FinishSendData(Connection); +} + +void SendFinishRequest(TConnection *Connection, const char *Name){ + if(!BeginSendData(Connection)){ + return; + } + + if(Name == NULL){ + error("SendFinishRequest: Name ist NULL.\n"); + return; + } + + SendByte(Connection, SV_CMD_FINISH_REQUEST); + SendString(Connection, Name); + FinishSendData(Connection); +} + +void SendCloseRequest(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_CLOSE_REQUEST); + FinishSendData(Connection); +} + +void SendOpenOwnChannel(TConnection *Connection, int Channel){ + if(!BeginSendData(Connection)){ + return; + } + + if(Channel < 0 || Channel >= GetNumberOfChannels()){ + error("SendOpenOwnChannel: Ungültiger Kanal %d.\n", Channel); + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + return; + } + + SendByte(Connection, SV_CMD_OPEN_OWN_CHANNEL); + SendWord(Connection, (uint16)Channel); + SendString(Connection, GetChannelName(Channel, Player->ID)); + FinishSendData(Connection); +} + +void SendCloseChannel(TConnection *Connection, int Channel){ + if(!BeginSendData(Connection)){ + return; + } + + SendByte(Connection, SV_CMD_CLOSE_CHANNEL); + SendWord(Connection, (uint16)Channel); + FinishSendData(Connection); +} + +void SendMessage(TConnection *Connection, int Mode, const char *Text, ...){ + if(Mode != TALK_ADMIN_MESSAGE + && Mode != TALK_EVENT_MESSAGE + && Mode != TALK_LOGIN_MESSAGE + && Mode != TALK_STATUS_MESSAGE + && Mode != TALK_INFO_MESSAGE + && Mode != TALK_FAILURE_MESSAGE){ + error("SendMessage: Ungültiger Modus %d.\n", Mode); + return; + } + + if(!BeginSendData(Connection)){ + return; + } + + char Buffer[4096]; + va_list ap; + va_start(ap, Text); + vsnprintf(Buffer, sizeof(Buffer), Text, ap); + va_end(ap); + + SendByte(Connection, SV_CMD_MESSAGE); + SendByte(Connection, (uint8)Mode); + SendString(Connection, Buffer); + FinishSendData(Connection); +} + +void SendSnapback(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + // TODO(fusion): Sometimes we check, sometimes we don't. + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + return; + } + + SendByte(Connection, SV_CMD_SNAPBACK); + SendByte(Connection, (uint8)Player->Direction); + FinishSendData(Connection); +} + +void SendOutfit(TConnection *Connection){ + if(!BeginSendData(Connection)){ + return; + } + + TPlayer *Player = Connection->GetPlayer(); + if(Player == NULL){ + return; + } + + uint16 FirstOutfit = (Player->Sex == 1) ? 128 : 136; + uint16 LastOutfit = (Player->Sex == 1) ? 131 : 139; + if(CheckRight(Player->ID, PREMIUM_ACCOUNT)){ + LastOutfit += 3; + } + + SendByte(Connection, SV_CMD_OUTFIT); + SendOutfit(Connection, Player->OrgOutfit); + SendWord(Connection, FirstOutfit); + SendWord(Connection, LastOutfit); + FinishSendData(Connection); +} + +void SendBuddyData(TConnection *Connection, uint32 CharacterID, const char *Name, bool Online){ + if(!BeginSendData(Connection)){ + return; + } + + if(Name == NULL){ + return; + } + + SendByte(Connection, SV_CMD_BUDDY_DATA); + SendWord(Connection, CharacterID); + SendString(Connection, Name); + SendByte(Connection, (Online ? 1 : 0)); + FinishSendData(Connection); +} + +void SendBuddyStatus(TConnection *Connection, uint32 CharacterID, bool Online){ + if(!BeginSendData(Connection)){ + return; + } + + if(Online){ + SendByte(Connection, SV_CMD_BUDDY_ONLINE); + }else{ + SendByte(Connection, SV_CMD_BUDDY_OFFLINE); + } + SendWord(Connection, CharacterID); + FinishSendData(Connection); +} + +void BroadcastMessage(int Mode, const char *Text, ...){ + char Message[1024]; + va_list ap; + va_start(ap, Text); + vsnprintf(Message, sizeof(Message), Text, ap); + va_end(ap); + + TConnection *Connection = GetFirstConnection(); + while(Connection != NULL){ + if(Connection->Live()){ + SendMessage(Connection, Mode, Message); + } + Connection = GetNextConnection(); + } +} + +void DeleteGamemasterRequest(const char *Name){ + if(Name == NULL){ + error("DeleteGamemasterRequest: Name ist NULL.\n"); + return; + } + + TConnection *Connection = GetFirstConnection(); + while(Connection != NULL){ + if(Connection->Live()){ + TPlayer *Player = Connection->GetPlayer(); + if(Player != NULL && ChannelSubscribed(CHANNEL_RULEVIOLATIONS, Player->ID)){ + SendDeleteRequest(Connection, Name); + } + } + Connection = GetNextConnection(); + } +} + +void InitSending(void){ + FirstSendingConnection = NULL; +} + +void ExitSending(void){ + // no-op +} diff --git a/src/stubs.hh b/src/stubs.hh index 61114c4..a7bd80d 100644 --- a/src/stubs.hh +++ b/src/stubs.hh @@ -18,7 +18,6 @@ typedef void TSendMailsFunction(TPlayerData *PlayerData); extern void AbortWriter(void); extern void AddBuddyOrder(TCreature *Creature, uint32 CharacterID); extern void RemoveBuddyOrder(TCreature *Creature, uint32 BuddyID); -extern void BroadcastMessage(int Mode, const char *Text, ...) ATTR_PRINTF(2, 3); extern void ChangeNPCState(TCreature *Npc, int NewState, bool Stimulus); extern void CharacterDeathOrder(TCreature *Creature, int OldLevel, uint32 Offender, const char *Remark, bool Unjustified); @@ -27,7 +26,6 @@ extern void ConvinceMonster(TCreature *Master, TCreature *Slave); extern void ChallengeMonster(TCreature *Challenger, TCreature *Monster); extern TCreature *CreateMonster(int Race, int x, int y, int z, int Home, uint32 Master, bool ShowEffect); extern void DecrementIsOnlineOrder(uint32 CharacterID); -extern void DeleteGamemasterRequest(const char *Name); extern void GetExitPosition(uint16 HouseID, int *x, int *y, int *z); extern int GetOrderBufferSpace(void); extern const char *GetHouseName(uint16 HouseID); @@ -54,60 +52,7 @@ extern void SavePlayerData(TPlayerData *Slot); extern bool LoadPlayerData(TPlayerData *Slot); extern bool PlayerDataExists(uint32 CharacterID); extern void SavePlayerDataOrder(void); -extern void SendAll(void); -extern void SendAmbiente(TConnection *Connection); -extern void SendBodyInventory(TConnection *Connection, uint32 CreatureID); -extern void SendBuddyData(TConnection *Connection, uint32 CharacterID, const char *Name, bool Online); -extern void SendBuddyStatus(TConnection *Connection, uint32 CharacterID, bool Online); -extern void SendClearTarget(TConnection *Connection); -extern void SendContainer(TConnection *Connection, int ContainerNr); -extern void SendCloseChannel(TConnection *Connection, int ChannelID); -extern void SendCloseContainer(TConnection *Connection, int ContainerNr); -extern void SendCloseRequest(TConnection *Connection); -extern void SendCloseTrade(TConnection *Connection); -extern void SendCreatureHealth(TConnection *Connection, uint32 CreatureID); -extern void SendCreatureLight(TConnection *Connection, uint32 CreatureID); -extern void SendCreatureOutfit(TConnection *Connection, uint32 CreatureID); -extern void SendCreatureSpeed(TConnection *Connection, uint32 CreatureID); -extern void SendCreatureSkull(TConnection *Connection, uint32 CreatureID); -extern void SendCreatureParty(TConnection *Connection, uint32 CreatureID); -extern void SendDeleteField(TConnection *Connection, int x, int y, int z, Object Obj); -extern void SendAddField(TConnection *Connection, int x, int y, int z, Object Obj); -extern void SendChangeField(TConnection *Connection, int x, int y, int z, Object Obj); -extern void SendDeleteInContainer(TConnection *Connection, int ContainerNr, Object Obj); -extern void SendCreateInContainer(TConnection *Connection, int ContainerNr, Object Obj); -extern void SendChangeInContainer(TConnection *Connection, int ContainerNr, Object Obj); -extern void SendDeleteInventory(TConnection *Connection, int Position); -extern void SendSetInventory(TConnection *Connection, int Position, Object Obj); -extern void SendEditList(TConnection *Connection, uint8 ListType, uint32 ID, const char *Text); -extern void SendFinishRequest(TConnection *Connection, const char *Name); -extern void SendFullScreen(TConnection *Connection); -extern void SendFloors(TConnection *Connection, bool Up); -extern void SendInitGame(TConnection *Connection, uint32 CharacterID); -extern void SendRights(TConnection *Connection); -extern void SendOutfit(TConnection *Connection); -extern void SendGraphicalEffect(TConnection *Connection, int x, int y, int z, int Type); -extern void SendTextualEffect(TConnection *Connection, int x, int y, int z, int Color, const char *Text); -extern void SendMissileEffect(TConnection *Connection, int OrigX, int OrigY, int OrigZ, int DestX, int DestY, int DestZ, int Type); -extern void SendRow(TConnection *Connection, int Direction); extern void SendMails(TPlayerData *PlayerData); -extern void SendMarkCreature(TConnection *Connection, uint32 CreatureID, int Color); -extern void SendMessage(TConnection *Connection, int Mode, const char *Text, ...) ATTR_PRINTF(3, 4); -extern void SendMoveCreature(TConnection *Connection, uint32 CreatureID, int x, int y, int z); -extern void SendOpenOwnChannel(TConnection *Connection, int Channel); -extern void SendPing(TConnection *Connection); -extern void SendPlayerData(TConnection *Connection); -extern void SendPlayerSkills(TConnection *Connection); -extern void SendPlayerState(TConnection *Connection, uint8 State); -extern void SendResult(TConnection *Connection, RESULT r); -extern void SendSnapback(TConnection *Connection); -extern void SendTalk(TConnection *Connection, uint32 StatementID, - const char *Sender, int Mode, const char *Text, int Data); -extern void SendTalk(TConnection *Connection, uint32 StatementID, - const char *Sender, int Mode, int Channel, const char *Text); -extern void SendTalk(TConnection *Connection, uint32 StatementID, - const char *Sender, int Mode, int x,int y,int z, const char *Text); -extern void SendTradeOffer(TConnection *Connection, const char *Name, bool OwnOffer, Object Obj); extern void ShowGuestList(uint16 HouseID, TPlayer *Player, char *Buffer); extern void ShowSubownerList(uint16 HouseID, TPlayer *Player, char *Buffer); extern void ShowNameDoor(Object Door, TPlayer *Player, char *Buffer); -- cgit v1.2.3