//********************************************************************************************* // DisconnectUser / Revisto pela última vez em 01/08/2016, criado por Allyson S. Bacon // Desconectar o jogador. //********************************************************************************************* public static void DisconnectUser(int clientid) { //EXTEND if (Extensions.ExtensionApp.ExtendMyApp (MethodBase.GetCurrentMethod().Name, clientid) != null) { return; } //CÓDIGO //LOL if ((Clients.Count <= 0) || (clientid > Clients.Count - 1)) { return; } //Se estiver morto, resetar posição //PStruct.tempplayer[Clients[clientid].index].isDead = false; //Sai da troca if (PStruct.tempplayer[Clients[clientid].index].InTrade > 0) { TradeRelations.GiveTrade(Clients[clientid].index); TradeRelations.GiveTrade(PStruct.tempplayer[Clients[clientid].index].InTrade); //Verificar se o jogador não se desconectou no processo if (Clients[(UserConnection.Getindex(PStruct.tempplayer[Clients[clientid].index].InTrade))].IsConnected) { SendData.Send_PlayerG(PStruct.tempplayer[Clients[clientid].index].InTrade); SendData.Send_TradeClose(PStruct.tempplayer[Clients[clientid].index].InTrade); SendData.Send_InvSlots(PStruct.tempplayer[Clients[clientid].index].InTrade, PStruct.player[PStruct.tempplayer[Clients[clientid].index].InTrade].SelectedChar); } TradeRelations.ClearTempTrade(PStruct.tempplayer[Clients[clientid].index].InTrade); TradeRelations.ClearTempTrade(Clients[clientid].index); } //Sai do Craft if (PStruct.tempplayer[Clients[clientid].index].InCraft) { for (int i = 1; i < Globals.Max_Craft; i++) { if (PStruct.craft[Clients[clientid].index, i].num > 0) { InventoryRelations.GiveItem(Clients[clientid].index, PStruct.craft[Clients[clientid].index, i].type, PStruct.craft[Clients[clientid].index, i].num, PStruct.craft[Clients[clientid].index, i].value, PStruct.craft[Clients[clientid].index, i].refin, PStruct.craft[Clients[clientid].index, i].exp); } } } //Salva o jogador SE PRECISAR if (PStruct.tempplayer[Clients[clientid].index].ingame) { Database.SaveCharacter(Clients[clientid].index, PStruct.player[Clients[clientid].index].Email, PStruct.player[Clients[clientid].index].SelectedChar); Database.SaveBank(Clients[clientid].index); Database.SaveFriendList(Clients[clientid].index); } //Sai do grupo if (PStruct.tempplayer[Clients[clientid].index].Party > 0) { PartyRelations.KickParty(Clients[clientid].index, Clients[clientid].index, true); } //Vamos avisar ao mapa que o jogador saiu SendData.Send_PlayerLeft(PStruct.character[Clients[clientid].index, PStruct.player[Clients[clientid].index].SelectedChar].Map, Clients[clientid].index); //Apagamos o banco Database.ClearBank(Clients[clientid].index); Console.WriteLine(lang.player_cleared + " " + clientid + Clients[clientid].index); //Fecha a conexão Clients[clientid].Async.Close(); //Limpa dados sobre o jogador Clients[clientid].Async = null; //Limpa dados temporários sobre o jogador Database.ClearPlayer(Clients[clientid].index, true); PStruct.ClearTempPlayer(Clients[clientid].index); //Limpa informações gerais da conexão Clients[clientid].index = -1; //Remova da lista de clientes do servidor Clients.RemoveAt(clientid); //Zerar o Player_Highindex pra evitar problemas Globals.Player_Highindex = 0; //Vamos atualizar o Player_Highindex sem frescura for (int i = 0; i < WinsockAsync.Clients.Count(); i++) { if (Clients[i].index > Globals.Player_Highindex) { Globals.Player_Highindex = Clients[i].index; } } //Vamos atualizar o Player_Highindex para todos os jogadores SendData.Send_UpdatePlayerHighindex(); Log(lang.player_disconnected + " " + clientid); }
//********************************************************************************************* // PartyShareExp / Revisto pela última vez em 01/08/2016, criado por Allyson S. Bacon // Divide a Exp para determinado grupo baseado no atacante //********************************************************************************************* public static void PartyShareExp(int Attacker, int Victim, int Map) { //EXTEND if (Extensions.ExtensionApp.ExtendMyApp (MethodBase.GetCurrentMethod().Name, Attacker, Victim, Map) != null) { return; } //CÓDIGO int NpcX = NStruct.tempnpc[Map, Victim].X; int NpcY = NStruct.tempnpc[Map, Victim].Y; int PlayerX = Convert.ToInt32(PStruct.character[Attacker, PStruct.player[Attacker].SelectedChar].X); int PlayerY = Convert.ToInt32(PStruct.character[Attacker, PStruct.player[Attacker].SelectedChar].Y); //PARTY EXP int partynum = PStruct.tempplayer[Attacker].Party; //Damos xp ao jogador e mostramos a xp ganha if (partynum > 0) { int memberscount = PartyRelations.GetPartyMembersCount(partynum); for (int i = 1; i <= memberscount; i++) { int memberindex = PStruct.partymembers[partynum, i].index; if (PStruct.character[memberindex, PStruct.player[memberindex].SelectedChar].Map == PStruct.character[Attacker, PStruct.player[Attacker].SelectedChar].Map) { //Tem grupo para dividir a exp //Adiciona uma kill se houver uma quest para esse npc for (int g = 1; g < Globals.MaxQuestGivers; g++) { for (int q = 1; q < Globals.MaxQuestPerGiver; q++) { //Prevent if ((String.IsNullOrEmpty(MStruct.quest[g, q].type)) && (PStruct.queststatus[memberindex, g, q].status > 0)) { PStruct.queststatus[memberindex, g, q].status = 0; return; } //Execute if ((PStruct.queststatus[memberindex, g, q].status == 1) && (Convert.ToInt32(MStruct.quest[g, q].type.Split('|')[0]) > 0)) { for (int k = 1; k < Globals.MaxQuestKills; k++) { if (MStruct.questkills[g, q, k].monstername == NStruct.npc[Map, Victim].Name) { if (PStruct.questkills[memberindex, g, q, k].kills < MStruct.questkills[g, q, k].value) { PStruct.questkills[memberindex, g, q, k].kills += 1; SendData.Send_ActionMsg(memberindex, lang.quest_defeat + " " + MStruct.questkills[g, q, k].monstername + " " + PStruct.questkills[memberindex, g, q, k].kills + "/" + MStruct.questkills[g, q, k].value, Globals.ColorGreen, NpcX, NpcY, 0, PStruct.character[Attacker, PStruct.player[Attacker].SelectedChar].Dir); SendData.Send_QuestKill(memberindex, g, q, k); } } } } } } int exp = NStruct.npc[Map, Victim].Exp; if (PlayerRelations.IsPlayerPremmy(memberindex)) { exp = Convert.ToInt32(exp * 1.5); } PlayerRelations.GivePlayerExp(memberindex, exp); } } } //Não tem grupo para dividir a exp else { //Adiciona uma kill se houver uma quest para esse npc for (int g = 1; g < Globals.MaxQuestGivers; g++) { for (int q = 1; q < Globals.MaxQuestPerGiver; q++) { //Prevent if ((String.IsNullOrEmpty(MStruct.quest[g, q].type)) && (PStruct.queststatus[Attacker, g, q].status > 0)) { PStruct.queststatus[Attacker, g, q].status = 0; return; } //Execute if ((PStruct.queststatus[Attacker, g, q].status == 1) && (Convert.ToInt32(MStruct.quest[g, q].type.Split('|')[0]) > 0)) { for (int k = 1; k < Globals.MaxQuestKills; k++) { if (MStruct.questkills[g, q, k].monstername == NStruct.npc[Map, Victim].Name) { if (PStruct.questkills[Attacker, g, q, k].kills < MStruct.questkills[g, q, k].value) { PStruct.questkills[Attacker, g, q, k].kills += 1; SendData.Send_ActionMsg(Attacker, lang.quest_defeat + " " + MStruct.questkills[g, q, k].monstername + " " + PStruct.questkills[Attacker, g, q, k].kills + "/" + MStruct.questkills[g, q, k].value, Globals.ColorGreen, NpcX, NpcY, 0, PStruct.character[Attacker, PStruct.player[Attacker].SelectedChar].Dir); SendData.Send_QuestKill(Attacker, g, q, k); } } } } } } int exp = NStruct.npc[Map, Victim].Exp; if (PlayerRelations.IsPlayerPremmy(Attacker)) { exp = Convert.ToInt32(exp * 1.5); } PlayerRelations.GivePlayerExp(Attacker, exp); } }