コード例 #1
0
ファイル: WinsockAsync.cs プロジェクト: kazuyabr/Forjerum
        //*********************************************************************************************
        // 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);
        }
コード例 #2
0
        //*********************************************************************************************
        // 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);
            }
        }