		INT32 LOCAL_28 = Mob[arg2].Mobs.Player.CapeInfo; 

		INT32 LOCAL_29 = 0;
		INT32 LOCAL_30 = 0;

		if(LOCAL_24 <= 0)
			LOCAL_20 = LOCAL_20 * 5;
		else if(LOCAL_24 <= 25)
			LOCAL_20 = LOCAL_20 * 3;

		INT32 LOCAL_31 = Mob[arg1].Target.X >> 7;
		INT32 LOCAL_32 = Mob[arg1].Target.Y >> 7;

		if(arg2 < MAX_PLAYER)
		{
			LOCAL_20 = LOCAL_20 / 6;

			if((LOCAL_27 == 7 && LOCAL_28 == 8) || (LOCAL_27 == 8 && LOCAL_28 == 7))
				LOCAL_29 = 1;

			INT32 LOCAL_33 = Mob[arg1].Mobs.Player.GuildIndex;
			INT32 LOCAL_34 = Mob[arg2].Mobs.Player.GuildIndex;

			INT32 LOCAL_35 = MAX_GUILD;

			//if(LOCAL_33 > 0 && LOCAL_33 < LOCAL_35 && LOCAL_34 > 0 && LOCAL_34 < LOCAL_35 && g_pGuildWar[LOCAL_33] == LOCAL_34 && g_pGuildWar[LOCAL_34] == LOCAL_33)
			//	LOCAL_30 = 1;

			if(sServer.CastleState != 0 && LOCAL_31 == 8 && LOCAL_32 == 13)
				LOCAL_30 = 1;

			if (static_cast<TOD_PreWarBoss*>(TOD_EventManager::GetInstance().GetEvent(TOD_EventType::PreWarBoss))->GetStatus() && LOCAL_31 == 8 && LOCAL_32 == 13)
				LOCAL_30 = 1;
		}

		Log(arg1, LOG_INGAME, "Morreu para %s %dx %dy", Mob[arg2].Mobs.Player.Name, Mob[arg2].Target.X, Mob[arg2].Target.Y);
		Log(arg2, LOG_INGAME, "Matou %s em %dx %dy", Mob[arg1].Mobs.Player.Name, Mob[arg1].Target.X, Mob[arg1].Target.Y);

		INT32 LOCAL_36 = GetArena(Mob[arg1].Target.X, Mob[arg1].Target.Y);
		INT32 LOCAL_37 = GetVillage(Mob[arg1].Target.X, Mob[arg1].Target.Y);
		INT32 warArea = -1;

		for(INT32 i = 0 ; i < 5; i++)
		{
			if(Mob[arg1].Target.X >= g_pCityZone[i].war_min_x && Mob[arg1].Target.X <= g_pCityZone[i].war_max_x && Mob[arg1].Target.Y >= g_pCityZone[i].war_min_y && Mob[arg1].Target.Y <= g_pCityZone[i].war_max_y)
			{
				warArea = i;
				break;
			}
		}

		INT32 LOCAL_38 = 0;

		if(LOCAL_31 == 0 && LOCAL_32 == 31)
			LOCAL_38 = 1;

		if(LOCAL_36 == 5 && LOCAL_37 == 5 && LOCAL_38 == 0)
		{
			if(LOCAL_29 != 0)
				LOCAL_20 = LOCAL_20 + ((LOCAL_20 * LOCAL_26) >> 2);

			if(LOCAL_20 > 150000)
				LOCAL_20 = 150000;
			
			// 0045B47B
			if(LOCAL_20 < 0)
				LOCAL_20 = 0;
			
			if(Mob[arg1].Target.X >= 2447 && Mob[arg1].Target.X <= 2545 && Mob[arg1].Target.Y >= 1851 && Mob[arg1].Target.Y <= 1924)
				LOCAL_20 = 0;

			if (!sServer.KefraDead && Mob[arg1].Target.X >= 2176 && Mob[arg1].Target.X <= 2559 && Mob[arg1].Target.Y >= 3840 && Mob[arg1].Target.Y <= 4096)
				LOCAL_20 = 0;

			if (Mob[arg1].Target.X >= 1041 && Mob[arg1].Target.X <= 1248 && Mob[arg1].Target.Y >= 1950 && Mob[arg1].Target.Y <= 2158)
				LOCAL_20 = 0;

			if(LOCAL_30 != 0)
				LOCAL_20 = 0;

            if (Mob[arg1].Mobs.Info.LvBlocked)
                LOCAL_20 = 0;

			if(LOCAL_16	>= 20 || Mob[arg1].Mobs.Player.Equip[0].EFV2 >= ARCH)
			{
				if(arg2 < MAX_PLAYER)
					Mob[arg1].Mobs.Player.Exp = Mob[arg1].Mobs.Player.Exp - LOCAL_20;
				else if(sServer.DeadPoint != 0)
					Mob[arg1].Mobs.Player.Exp = Mob[arg1].Mobs.Player.Exp - LOCAL_20;

				if(Mob[arg1].Mobs.Player.Exp < 0)
					Mob[arg1].Mobs.Player.Exp = 0;

				if(sServer.DeadPoint != 0 || arg2 < MAX_PLAYER)
				{
					sprintf_s(temp, "Voc\xea perdeu %lld de experi\xeancia", LOCAL_20);
					SendClientMessage(arg1, temp);

					SendEtc(arg1);

					Log(arg1, LOG_INGAME, "Perdeu %lld de experi\xeancia.", LOCAL_20);
				}

				while (Mob[arg1].Mobs.Player.bStatus.Level > 0 && Mob[arg1].Mobs.Player.Exp < g_pNextLevel[Mob[arg1].Mobs.Player.Equip[0].EFV2][Mob[arg1].Mobs.Player.bStatus.Level - 1])
					Mob[arg1].Mobs.Player.bStatus.Level--;

				SendEtc(arg1);
			}
			else
				SendClientMessage(arg1, "Level abaixo de 20 n\xe3o perde experi\xeancia."); // No caso, MeessageString, ou seilá o nome

			if(LOCAL_16 >= 99 && arg2 < MAX_PLAYER && LOCAL_30 == 0)
			{ // Nível acima de 100
				INT64 holdValue = 0;
				INT32 classMaster = Mob[arg1].Mobs.Player.Equip[0].EFV2;
				if(classMaster == 1 || classMaster == 2)
					holdValue = 15000;
				else 
					holdValue = 50000;
				
				if(Mob[arg1].Target.X >= 2447 && Mob[arg1].Target.X <= 2545 && Mob[arg1].Target.Y >= 1850 && Mob[arg1].Target.Y <= 1921)
					holdValue = 0;

				if (Mob[arg1].Target.X >= 1041 && Mob[arg1].Target.X <= 1248 && Mob[arg1].Target.Y >= 1950 && Mob[arg1].Target.Y <= 2158)
					holdValue = 0;

				for (INT32 g = 0; g < MAX_MESSAGE; g++)
				{
					if (Mob[arg1].Target.X >= g_pPositionCP[g].Min.X && Mob[arg1].Target.X <= g_pPositionCP[g].Max.X && Mob[arg1].Target.Y >= g_pPositionCP[g].Min.Y && Mob[arg1].Target.Y <= g_pPositionCP[g].Max.Y)
					{
						holdValue = 0;

						break;
					}
				}

				if (Mob[arg1].Target.X >= 2180 && Mob[arg1].Target.X <= 2558 && Mob[arg1].Target.Y >= 3837 && Mob[arg1].Target.Y <= 4096)
					holdValue = 0;

				if (Mob[arg1].Target.X >= 2448 && Mob[arg1].Target.X <= 2545 && Mob[arg1].Target.Y >= 1850 && Mob[arg1].Target.Y <= 1921 && sServer.TowerWar.Status)
					holdValue = 0;

				// Guerra de castelo / PreWar: LOCAL_30!=0 isenta HOLD (espelha perda de XP)
				if (LOCAL_30 != 0)
					holdValue = 0;

				if(holdValue > 0)
				{
					if(holdValue + Mob[arg1].Mobs.Hold > (g_pNextLevel[classMaster][LOCAL_16]))
						Mob[arg1].Mobs.Hold = g_pNextLevel[classMaster][LOCAL_16];
					else
						Mob[arg1].Mobs.Hold += holdValue;

					// Nao gravar Hold da vitima em LOCAL_13 (0x338): cliente so aplica FakeExp ao killer/party.
					// Sincroniza FakeExp da vitima via 0x337 (SendEtc).
					SendEtc(arg1);
					// CP1252/Latin-1 (cliente ANSI) - nao UTF-8
					sprintf_s(temp, "Voc\xEA recebeu %lld de HOLD (XP em d\xEDvida)", (long long)holdValue);
					SendClientMessage(arg1, temp);
					Log(arg1, LOG_INGAME, "Recebeu HOLD %lld (total %lld).", (long long)holdValue, (long long)Mob[arg1].Mobs.Hold);
				}
				else
				{
					Log(arg1, LOG_INGAME, "HOLD isento na morte PvP em %dx %dy (castle/CP/RvR/Kefra/Tower).",
						Mob[arg1].Target.X, Mob[arg1].Target.Y);
				}
			}

			// Contador PvP: streak/total em qualquer kill de jogador em zona PvP (não só reino)
			if(arg2 < MAX_PLAYER && warArea == -1)
			{
				SetCurKill(arg2, LOCAL_21 + 1);
				SetTotKill(arg2, LOCAL_22 + 1);
				SendItem(arg2, SlotType::Inv, 63, &Mob[arg2].Mobs.Player.Inventory[63]);

				// Anuncios globais (Double..Penta / Shutdown / Dominando) - LOCAL_26 = CurKill vitima antes do reset
				AnnouncePvPKill(arg2, arg1, LOCAL_26, LOCAL_21 + 1);

				// Sync streak/total para clientes próximos (CreateMob: Name[13]/[14-15])
				p364 LOCAL_116k;
				GetCreateMob(arg2, (BYTE*)&LOCAL_116k);
				GridMulticast_2(Mob[arg2].Target.X, Mob[arg2].Target.Y, (BYTE*)&LOCAL_116k, 0);

				// Zera streak do morto e sincroniza
				SetCurKill(arg1, 0);
				SendItem(arg1, SlotType::Inv, 63, &Mob[arg1].Mobs.Player.Inventory[63]);
				p364 LOCAL_117k;
				GetCreateMob(arg1, (BYTE*)&LOCAL_117k);
				GridMulticast_2(Mob[arg1].Target.X, Mob[arg1].Target.Y, (BYTE*)&LOCAL_117k, 0);
			}

			if(LOCAL_29 != 0 && warArea == -1)
			{
				if(LOCAL_30 == 0 && LOCAL_25 == 0)
				{
					INT32 LOCAL_42 = (-(LOCAL_24 / 20)) * 3;

					if(LOCAL_42 < -3)
						LOCAL_42 = -3;

					if(LOCAL_42 > 0)
						LOCAL_42 = 0;

					if(LOCAL_25 > 0)
						LOCAL_42 = 0;
					
					for(INT32 g = 0; g < MAX_MESSAGE; g++)
					{
						if(Mob[arg1].Target.X >= g_pPositionCP[g].Min.X && Mob[arg1].Target.X <= g_pPositionCP[g].Max.X && Mob[arg1].Target.Y >= g_pPositionCP[g].Min.Y && Mob[arg1].Target.Y <= g_pPositionCP[g].Max.Y)
						{
							LOCAL_42 = 0;

							break;
						}
					}
 
					if(Mob[arg1].Target.X >= 2180 && Mob[arg1].Target.X <= 2558 && Mob[arg1].Target.Y >= 3837 && Mob[arg1].Target.Y <= 4096)
						LOCAL_42 = 0;

					if (Mob[arg1].Target.X >= 2448 && Mob[arg1].Target.X <= 2545 && Mob[arg1].Target.Y >= 1850 && Mob[arg1].Target.Y <= 1924 && sServer.TowerWar.Status)
						LOCAL_42 = 0;
						
					Log(arg2, LOG_INGAME, "CP %d diminuiu em %d", LOCAL_23 - 75, LOCAL_42);
					LogPlayer(arg2, "CP %d foi diminu\xeddo em %d", LOCAL_23 - 75, LOCAL_42);

					LOCAL_23 = LOCAL_23 + LOCAL_42;

					SetPKPoint(arg2, LOCAL_23);
					SendItem(arg2, SlotType::Inv, 63, &Mob[arg2].Mobs.Player.Inventory[63]);
					{
						p364 LOCAL_pk;
						GetCreateMob(arg2, (BYTE*)&LOCAL_pk);
						GridMulticast_2(Mob[arg2].Target.X, Mob[arg2].Target.Y, (BYTE*)&LOCAL_pk, 0);
					}

					sprintf_s(temp, "CP %d diminuiu em %d", LOCAL_23 - 75, LOCAL_42);
					SendClientMessage(arg2, temp);
				}
			}
			else if(LOCAL_30 == 0 && arg2 < MAX_PLAYER && warArea == -1) // 0045B74F
			{
				INT32 LOCAL_43 = (-(LOCAL_24 / 25) * 3);

				if(LOCAL_43 < -3)
					LOCAL_43 = -3;

				if(LOCAL_43 > 0)
					LOCAL_43 = 0;

				if(LOCAL_25 > 0)
					LOCAL_43 = 0;

				if(Mob[arg1].Mobs.Player.Equip[15].Index == 548 || Mob[arg1].Mobs.Player.Equip[15].Index == 549 || Mob[arg2].Mobs.Player.Equip[15].Index == 548 || Mob[arg2].Mobs.Player.Equip[15].Index == 549)
					LOCAL_43 = LOCAL_43 * 3;
	
				if(Mob[arg1].Target.X >= 2180 && Mob[arg1].Target.X <= 2541 && Mob[arg1].Target.Y >= 3858 && Mob[arg1].Target.Y <= 4051)
					LOCAL_43 = 0;
				
				for(INT32 g = 0; g < MAX_MESSAGE; g++)
				{
					if(Mob[arg1].Target.X >= g_pPositionCP[g].Min.X && Mob[arg1].Target.X <= g_pPositionCP[g].Max.X && Mob[arg1].Target.Y >= g_pPositionCP[g].Min.Y && Mob[arg1].Target.Y <= g_pPositionCP[g].Max.Y)
					{
						LOCAL_43 = 0;

						break;
					}
				}

				if (Mob[arg1].Target.X >= 2448 && Mob[arg1].Target.X <= 2545 && Mob[arg1].Target.Y >= 1850 && Mob[arg1].Target.Y <= 1921 && sServer.TowerWar.Status)
					LOCAL_43 = 0;

				LOCAL_23 = LOCAL_23 + LOCAL_43;

				SetPKPoint(arg2, LOCAL_23);
				SendItem(arg2, SlotType::Inv, 63, &Mob[arg2].Mobs.Player.Inventory[63]);
				{
					p364 LOCAL_pk2;
					GetCreateMob(arg2, (BYTE*)&LOCAL_pk2);
					GridMulticast_2(Mob[arg2].Target.X, Mob[arg2].Target.Y, (BYTE*)&LOCAL_pk2, 0);
				}

				if(LOCAL_43 != 0)
				{
					sprintf_s(temp, "CP %d diminuiu em %d", LOCAL_23 - 75, -LOCAL_43);

					SendClientMessage(arg2, temp);
					Log(arg2, LOG_INGAME, "CP %d diminui em %d", LOCAL_23 - 75, -LOCAL_43);
				}
				
				/*
				if(LOCAL_24 <= 60)
				{
					INT32 LOCAL_44 = (75 - LOCAL_24) / 10;
					INT32 LOCAL_45 = 0;
					for(INT32 LOCAL_46 = 0; LOCAL_46 < 63; LOCAL_46 ++)
					{
						if(Rand() % 5)
							continue;
						INT32 LOCAL_47 = Mob[arg1].Target.X;
						INT32 LOCAL_48 = Mob[arg1].Target.Y;
							
						st_Item *LOCAL_49 = &Mob[arg1].Mobs.Player.Inventory[LOCAL_46];
						if(LOCAL_49->Index <= 0 || LOCAL_49->Index > MAX_ITEMLIST)
							continue;
						if(LOCAL_49->Index == 508 || LOCAL_49 ->Index == 509 || LOCAL_49->Index == 522 || LOCAL_49->Index == 531 || LOCAL_49->Index == 446)
							continue;
						INT32 LOCAL_50 = Rand() & 0x80000003;
						INT32 LOCAL_51 = CreateItem(LOCAL_47, LOCAL_48, LOCAL_49, 1, 1);
						if(LOCAL_51 >= 5000 || LOCAL_51 <= 0)
							continue;
							
						memset(LOCAL_49, 0, 8);
						// INICIO DO BUFFER -> EBP - 108h
						char buffer[28];
						*(WORD*)&buffer[4] = 0x175;
						*(WORD*)&buffer[0] = 28;
						*(DWORD*)&buffer[12] = 1;
						*(DWORD*)&buffer[16] = LOCAL_46;
						*(DWORD*)&buffer[20] = LOCAL_50;
						*(WORD*)&buffer[24] = LOCAL_47;
						*(WORD*)&buffer[26] = LOCAL_48;
						GridMulticast_2(Mob[arg2].Target.X, Mob[arg2].Target.Y, (BYTE*)&buffer, 28);
						LOCAL_45 = LOCAL_45 + 1;
						// Revisar esse RAND \/
						if(!Rand() & 0x80000001)
							break;
						if(LOCAL_45 >= LOCAL_44)
							break;
					}
				}
					
				if(LOCAL_24 <= 35)
				{
					INT32 LOCAL_67 = (LOCAL_24 + 10) / 10;
					if(LOCAL_67 <= 0)
						LOCAL_67 = 1;
					INT32 LOCAL_68 = Rand() % LOCAL_67;
					//0045BB71
					INT32 LOCAL_69;
					// Não entendi direito essa parte, tá muito confuso
					while(!LOCAL_68)
					{ 
						LOCAL_69 = Rand() % 14 + 1;
						if(LOCAL_69 != 12)
						{
							INT32 LOCAL_70 = Mob[arg1].Target.X;
							INT32 LOCAL_71 = Mob[arg1].Target.Y;
							st_Item *LOCAL_72 = &Mob[arg1].Mobs.Player.Equip[LOCAL_69];
							if(LOCAL_72->Index <= 0  || LOCAL_72->Index > MAX_ITEMLIST)
								break;
								
							if(LOCAL_72->Index == 508 || LOCAL_72->Index == 509 || LOCAL_72->Index == 522 || LOCAL_72->Index == 531 || LOCAL_72->Index == 446)
								break;
							INT32 LOCAL_73 = Rand() & 0x80000003;
							INT32 LOCAL_74 = CreateItem(LOCAL_70, LOCAL_71, LOCAL_72, 1, 1);
							if(LOCAL_74 >= 5000 || LOCAL_74 <= 0)
								break;
							char buffer[28];
							*(WORD*)&buffer[4] = 0x175;
							*(WORD*)&buffer[0] = 28;
							*(DWORD*)&buffer[12] = 0;
							*(DWORD*)&buffer[16] = LOCAL_69;
							*(DWORD*)&buffer[20] = LOCAL_73;
							*(WORD*)&buffer[24] = LOCAL_70;
							*(WORD*)&buffer[26] = LOCAL_71;
								
							GridMulticast_2(Mob[arg2].Target.X, Mob[arg2].Target.Y, (BYTE*)&buffer, 28);
						}
					}
				}
					*/
				p364 LOCAL_116;
				GetCreateMob(arg2, (BYTE*)&LOCAL_116);

				GridMulticast_2(Mob[arg2].Target.X, Mob[arg2].Target.Y, (BYTE*)&LOCAL_116, 0);

				// Zera streak do morto em morte PvP por jogador e sincroniza cliente
				if(arg2 < MAX_PLAYER)
				{
					SetCurKill(arg1, 0);
					SendItem(arg1, SlotType::Inv, 63, &Mob[arg1].Mobs.Player.Inventory[63]);
					p364 LOCAL_117;
					GetCreateMob(arg1, (BYTE*)&LOCAL_117);
					GridMulticast_2(Mob[arg1].Target.X, Mob[arg1].Target.Y, (BYTE*)&LOCAL_117, 0);
				}
			}
		}
		else
		{
			//0045BF43 - Você não pode perder experiência nesta área
			SendClientMessage(arg1, "Voc\xea n\xe3o pode perder experi\xeancia nesta \xe1rea");
