Re: Server julia Ia 2.0 full quà tết dành cho anh em
Duelsystem.cpp
void DuelSystemClass__InsideTrigger(void * lpParam);
DuelSystemClass Duel;
void DuelSystemClass::NPCTalk_GateKeeper(DWORD PlayerID)
{
if(isNewSystem == 1)
{
BYTE Dialog[0x5C]={0};
Dialog[0]= 0xC1;
Dialog[1]= 0x5C;
Dialog[2]= 0xAA;
Dialog[3]= 0x06;
for( int Room = 0; Room < 4; Room++)
{
if(DuelRoom[Room] == 1)
{
memcpy (&Dialog[4 + Room * 22], GetName(Player[0][Room]), 10 );
memcpy (&Dialog[4+10 + Room * 22], GetName(Player[1][Room]), 10 );
Dialog[4+19+1 + Room * 22]= 0x01;
Dialog[4+19+2 + Room * 22]= 0x01;
}
}
BYTE buff[4] = { 0xC3 , 0x04 , 0x30 , 0x21 };
GsDataSendFuncEx (PlayerID,buff , buff[1]) ;
GsDataSendFuncEx( PlayerID , (PBYTE)Dialog , Dialog[1] );
}
}
BOOL DuelSystemClass::isInDuelRoom(DWORD PlayerID)
{
for(int Room = 0;Room < 4;Room++)
{
if((Player[0][Room] == PlayerID) || (Player[1][Room] == PlayerID))
{
return 1;
}
}
return 0;
}
BYTE DuelSystemClass::GetSpectatorPosition(DWORD PlayerID, BYTE Room)
{
for(int Pos = 0;Pos < 10;Pos++)
{
if(Spectator[Pos][Room] == PlayerID)
{
return Pos;
}
}
return 0xFF;
}
BYTE DuelSystemClass::SetSpectator(DWORD PlayerID, BYTE Room)
{
for(int Pos = 0;Pos < 10;Pos++)
{
if(Spectator[Pos][Room] == 0)
{
Spectator[Pos][Room] = PlayerID;
return Pos;
}
}
return 0xFF;
}
int DuelSystemClass:

uelOK_EnterRoom(DWORD PlayerID1, DWORD PlayerID2)
{
if(isNewSystem == 1)
{
int EnterTo = -1;
if(isInDuelRoom(PlayerID1) == 0)
{
for(int Room = 0;Room < 4;Room++)
{
if(DuelRoom[Room] == 0)
{
EnterTo = Room;
DuelRoom[Room] = 1;
break;
}
}
if(EnterTo != -1)
{
Player[0][EnterTo] = PlayerID1;
Player[1][EnterTo] = PlayerID2;
WarpRoom(PlayerID1,EnterTo);
WarpRoom(PlayerID2,EnterTo);
}
}
return EnterTo;
}else
{
return 10;
}
}
void DuelSystemClass::WarpRoom(DWORD PlayerID, BYTE Room)
{
int Gate = 0;
BOOL isSpectator = 0;
switch(Room)
{
case 0:
{
if(Player[0][Room] == PlayerID)
{
Gate = 295;
}else if(Player[1][Room] == PlayerID)
{
Gate = 296;
}else
{
Gate = 303;
isSpectator = 1;
}
}break;
case 1:
{
if(Player[0][Room] == PlayerID)
{
Gate = 297;
}else if(Player[1][Room] == PlayerID)
{
Gate = 398;
}else
{
Gate = 304;
isSpectator = 1;
}
}break;
case 2:
{
if(Player[0][Room] == PlayerID)
{
Gate = 299;
}else if(Player[1][Room] == PlayerID)
{
Gate = 300;
}else
{
Gate = 305;
isSpectator = 1;
}
}break;
case 3:
{
if(Player[0][Room] == PlayerID)
{
Gate = 301;
}else if(Player[1][Room] == PlayerID)
{
Gate = 302;
}else
{
Gate = 306;
isSpectator = 1;
}
}break;
case 0xFF:
{
Gate = 294;
}
}
if((isSpectator == 1) && (DuelRoom[Room] == 1))
{
if(SetSpectator(PlayerID,Room) != 0xFF)
{
SCFGateMove_Hook(PlayerID, Gate);
SetDuelInfo(PlayerID,Room);
}else
{
Gs_GCServerMsgStringSend("This room is full!",PlayerID, 0x01);
}
}else
{
SCFGateMove_Hook(PlayerID, Gate);
}
}
void DuelSystemClass__InsideTrigger(void * lpParam)
{
while(true)
{
for(int Room = 0; Room < 4; Room++)
{
for(int i = 0; i < 10; i++)
{
if(Duel.Spectator
[Room] != 0)
{
if (Duel.DuelRoom[Room] == 1)
Duel.SendDuelInfo(Duel.Spectator[Room],Room);
else
Duel.DeleteSpectator(Duel.Spectator[Room],Room);
}
}
}
Sleep(1000);
}
_endthread();
}
void DuelSystemClass:
eleteSpectator(DWORD PlayerID, BYTE Room)
{
//18 transparent
//27 full invisible
int Pos = GetSpectatorPosition(PlayerID,Room);
if (Pos != 0xFF)
{
if(IsOnGame(PlayerID) == 1)
{
//Remove Invisibility Skill
gObjSkillStruct[PlayerID].Transparent=0;
CallSkillEffect(PlayerID,18,0x00,PlayerID,1);
CallSkillEffect(PlayerID,98,0x00,PlayerID,1);
WarpRoom(PlayerID,0xFF);
}
Spectator[Pos][Room] = 0;
}
}
void DuelSystemClass::SetDuelInfo(DWORD PlayerID, BYTE Room)
{
if((IsOnGame(Player[0][Room]) == 1) && (IsOnGame(Player[1][Room]) == 1))
{
BYTE Packet0[0x0F] = {0xC1,0x0F,0xAA,0x0B, 0x01};
memcpy (&Packet0[5], GetName(PlayerID), 10 );
GsDataSendFuncEx( PlayerID , (PBYTE)Packet0 , Packet0[1] );
//Send Invisibility Skill
gObjSkillStruct[PlayerID].Transparent=1;
CallSkillEffect(PlayerID,98,0x01,PlayerID,1);
CallSkillEffectToMap(PlayerID,18,0x01,PlayerID,1);
//
BYTE Packet1[0x1E] = {0xC1,0x1E,0xAA,0x07, 0x00, 0x00};
memcpy (&Packet1[6], GetName(Player[0][Room]), 10 );
memcpy (&Packet1[6+10], GetName(Player[1][Room]), 10 );
Packet1[6+20] = HIBYTE(Player[0][Room]);
Packet1[6+21] = LOBYTE(Player[0][Room]);
Packet1[6+22] = HIBYTE(Player[1][Room]);
Packet1[6+23] = LOBYTE(Player[1][Room]);
GsDataSendFuncEx( PlayerID , (PBYTE)Packet1 , Packet1[1] );
BYTE Packet2[0x05] = {0xC1,0x05,0xAA,0x0D, 0x98};
GsDataSendFuncEx( PlayerID , (PBYTE)Packet2 , Packet2[1] );
BYTE Packet3[0x0A] = {0xC1,0x0A,0xAA,0x04, HIBYTE(Player[0][Room]), LOBYTE(Player[0][Room]), HIBYTE(Player[1][Room]), LOBYTE(Player[1][Room]),0x00,0x00};
GsDataSendFuncEx( PlayerID , (PBYTE)Packet3 , Packet3[1] );
}else
{
ClearRoom(Room);
}
}
void DuelSystemClass::SendDuelInfo(DWORD PlayerID, BYTE Room)
{
if(isNewSystem == 1)
{
if((IsOnGame(Player[0][Room]) == 1) && (IsOnGame(Player[1][Room]) == 1) && (DuelRoom[Room] == 1))
{
BYTE Packet[0x0C] = {0xC1,0x0C,0xAA,0x05, HIBYTE(Player[0][Room]), LOBYTE(Player[0][Room]), HIBYTE(Player[1][Room]), LOBYTE(Player[1][Room])};
LPGOBJSTRUCT pObj1 = (LPGOBJSTRUCT)(Player[0][Room]*gObjSize + gObjBaseAddr);
LPGOBJSTRUCT pObj2 = (LPGOBJSTRUCT)(Player[1][Room]*gObjSize + gObjBaseAddr);
int LifePercent1 = (int)((pObj1->Life * 100) / (pObj1->MaxLife + pObj1->AddLife));
int ShieldPercent1 = (int)((pObj1->iShield * 100) / (pObj1->iMaxShield + pObj1->iAddShield));
int LifePercent2 = (int)((pObj2->Life * 100) / (pObj2->MaxLife + pObj2->AddLife));
int ShieldPercent2 = (int)((pObj2->iShield * 100) / (pObj2->iMaxShield + pObj2->iAddShield));
Packet[8] = LifePercent1;
Packet[9] = LifePercent2;
Packet[10] = ShieldPercent1;
Packet[11] = ShieldPercent2;
GsDataSendFuncEx( PlayerID , (PBYTE)Packet , Packet[1] );
}else
{
DeleteSpectator(PlayerID,Room);
}
}
}
void DuelSystemClass::ClearRoom(BYTE Room)
{
DuelRoom[Room] = 0;
Player[0][Room]= 0;
Player[1][Room]= 0;
for(int i = 0; i < 10; i++)
Spectator[Room] = 0;
}
void DuelSystemClass::GladiatorsGloryBuff(DWORD PlayerID)
{
if((IsOnGame(PlayerID) == 1) && (PlayerID != 0))
{
if(gObjSkillStruct[PlayerID].GladiatorsGlory != 1)
{
gObjSkillStruct[PlayerID].GladiatorsGlory=1;
gObjSkillStruct[PlayerID].GladiatorsGlorySeconds=3600;
CallSkillEffect(PlayerID,103,0x01,PlayerID,1);
Set_ExtraItemDropRate(PlayerID,10);
gObjSkillStruct[PlayerID].GladiatorsGloryExp = 0;
}else
{
gObjSkillStruct[PlayerID].GladiatorsGlorySeconds=3600;
}
if(IsNewClass(PlayerID) != 1)
{
gObjSkillStruct[PlayerID].GladiatorsGloryExp = 1;
Set_ExtraExpRate(PlayerID,20);
}
}
}
void DuelSystemClass::ClearRoombyPlayerID(DWORD PlayerID, BYTE Winner)
{
//Still Need add buff to Winner
if(isNewSystem == 1)
{
for(int Room = 0; Room < 4; Room++)
{
if((Player[0][Room] == PlayerID) || (Player[1][Room] == PlayerID))
{
if(Player[0][Room] != PlayerID)
{
GladiatorsGloryBuff(Player[0][Room]);
}else
{
GladiatorsGloryBuff(Player[1][Room]);
}
WarpRoom(Player[0][Room],0xFF);
WarpRoom(Player[1][Room],0xFF);
DuelRoom[Room] = 0;
Player[0][Room]= 0;
Player[1][Room]= 0;
break;
}
}
}
}
void DuelSystemClass::Init(char * FilePath)
{
isNewSystem = GetPrivateProfileInt("DuelSystem", "SCFDuelSystemEnabled",0, FilePath) ;
if(isNewSystem == 1)
{
for(int Room = 0; Room < 4; Room++)
ClearRoom(Room);
_beginthread( DuelSystemClass__InsideTrigger, 0, NULL );
}
}