예제 #1
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            if (client.Player.CurrentRoom == null)
                return 0;


            int id = packet.ReadInt();
            GamePlayer player = Managers.WorldMgr.GetPlayerById(id);

            if (player == client.Player)
                return 0;

            List<GamePlayer> players = client.Player.CurrentRoom.GetPlayers();
            foreach (GamePlayer p in players)
            {
                if (p == player)
                {
                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Sameroom"));
                    return 0;
                }
            }

            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_INVITE);
            if (player != null && player.CurrentRoom == null)
            {

                pkg.WriteInt(client.Player.PlayerCharacter.ID);
                pkg.WriteInt(client.Player.CurrentRoom.RoomId);
                pkg.WriteInt(client.Player.CurrentRoom.MapId);
                pkg.WriteByte((byte)client.Player.CurrentRoom.TimeMode);
                pkg.WriteByte((byte)client.Player.CurrentRoom.RoomType);
                pkg.WriteByte((byte)client.Player.CurrentRoom.HardLevel);
                pkg.WriteByte((byte)client.Player.CurrentRoom.LevelLimits);
                pkg.WriteString(client.Player.PlayerCharacter.NickName);
                pkg.WriteBoolean(true);
                pkg.WriteInt(5);
                pkg.WriteString(client.Player.CurrentRoom.Name);
                pkg.WriteString(client.Player.CurrentRoom.Password);

                //TrieuLSL BN IMInvite barrierNum
                pkg.WriteInt(50);


                player.Out.SendTCP(pkg);
            }
            else
            {
                if (player != null && player.CurrentRoom != null && player.CurrentRoom != client.Player.CurrentRoom)
                {

                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Room"));
                }
                else
                {
                    client.Out.SendMessage(eMessageType.ERROR, LanguageMgr.GetTranslation("friendnotinthesameserver.Fail"));
                }
            }
            return 0;
        }
예제 #2
0
 public void SendLoginFailed(string msg)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.LOGIN);
     pkg.WriteByte(1);
     pkg.WriteString(msg);
     SendTCP(pkg);
 }
        protected override void ExecuteImp(BaseGame game, long tick)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, m_living.Id);

            pkg.Parameter1 = m_living.Id;
            pkg.WriteByte((byte)eTankCmdType.LIVING_RANGEATTACKING);

            List<Living> playersAround = game.Map.FindPlayers(m_fx, m_tx, m_players);
            int count = playersAround.Count;
            foreach (Living p in playersAround)
            {
                if (m_living.IsFriendly(p) == true)
                    count--;
            }
            pkg.WriteInt(count);
            m_living.SyncAtTime = false;
            try
            {
                foreach (Living p in playersAround)
                {
                    p.SyncAtTime = false;

                    if (m_living.IsFriendly(p) == true)
                        continue;
                    int dander = 0;
                    p.IsFrost = false;
                    game.SendGameUpdateFrozenState(p);
                    int damage = MakeDamage(p);
                    int critical = MakeCriticalDamage(p, damage);
                    int totalDemageAmount = 0;
                    if (p.TakeDamage(m_living, ref damage, ref critical, "范围攻击"))
                    {
                        totalDemageAmount = damage + critical;
                        if (p is Player)
                        {
                            Player player = p as Player;
                            dander = player.Dander;
                        }
                    }
                    pkg.WriteInt(p.Id);
                    pkg.WriteInt(totalDemageAmount);
                    pkg.WriteInt(p.Blood);
                    //同步怒气值
                    pkg.WriteInt(dander);
                    //attackEffect
                    pkg.WriteInt(new Random().Next(2));
                }
                game.SendToAll(pkg);

                Finish(tick);
            }
            finally
            {
                m_living.SyncAtTime = true;
                foreach (Living p in playersAround)
                {
                    p.SyncAtTime = true;
                }
            }
        }
예제 #4
0
        public int HandlePacket(GameClient client, GSPacketIn packet)
        {
            
            //bool result = false;
            if (string.IsNullOrEmpty(client.Player.PlayerCharacter.CheckCode))
                return 1;

            //int check  = packet.ReadInt();

            string check = packet.ReadString();
            if (client.Player.PlayerCharacter.CheckCode.ToLower() == check.ToLower())
            {
                client.Player.PlayerCharacter.CheckCount = 0;

                //int rewardItemID = GameServer.Instance.Configuration.CheckRewardItem;
                //ItemTemplateInfo rewardItem = ItemMgr.GetSingleGoods(rewardItemID);
                //ItemInfo item = ItemInfo.CreateFromTemplate(rewardItem, 1, (int)Game.Server.Statics.ItemAddType.CheckCode);
                //if (item != null)
                //{
                //    item.IsBinds = true;
                //    if (client.Player.AddItem(item, Game.Server.Statics.ItemAddType.CheckCode) != -1)
                //    {
                //        client.Out.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("CheckCodeHandler.Msg1", item.Template.Name));
                //    }
                //    else
                //    {
                //        client.Out.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("CheckCodeHandler.Msg2"));
                //    }
                //}
                int GP = LevelMgr.GetGP(client.Player.PlayerCharacter.Grade);
                client.Player.AddGP(LevelMgr.IncreaseGP(client.Player.PlayerCharacter.Grade, client.Player.PlayerCharacter.GP));
               
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("CheckCodeHandler.Msg1", client.Player.PlayerCharacter.Grade * 12));
                //result = true;
                packet.ClearContext();
                packet.WriteByte(1);
                packet.WriteBoolean(false);
                client.Out.SendTCP(packet);
            }
           // else if (client.Player.PlayerCharacter.CheckError < 1 && client.Player.PlayerCharacter.CheckCount < 20000)
            else if (client.Player.PlayerCharacter.CheckError < 9)
            {
                client.Out.SendMessage(eMessageType.ChatERROR, LanguageMgr.GetTranslation("CheckCodeHandler.Msg3"));
                client.Player.PlayerCharacter.CheckError++;
                client.Out.SendCheckCode();
               
            }
            else
            {
                client.Out.SendMessage(eMessageType.Normal, LanguageMgr.GetTranslation("CheckCodeHandler.Msg3"));
                client.Disconnect();
              
            }
          
         
            return 0;
        }
예제 #5
0
        public override void OnStarting(BaseSceneGame game, Game.Base.Packets.GSPacketIn data)
        {
            //base.OnStarting(game, data);

            TankData tank = game.Data;

            tank.Reset();
            GamePlayer[] list   = game.Data.GetAllPlayers();
            int          i      = random.Next(list.Length);
            GamePlayer   player = GetLowDelayPlayer(game, list[i]);
            //List<Point> pos = new List<Point>();
            //pos.AddRange(Managers.MapMgr.GetMapPos(game.Data.MapIndex));

            MapPoint pos = Managers.MapMgr.GetMapRandomPos(game.Data.MapIndex);

            tank.CurrentWind = random.Next(-40, 40);
            data.WriteInt(player.PlayerCharacter.ID);
            data.WriteInt(tank.CurrentWind);
            data.WriteByte((byte)game.Data.Count);
            Point temp     = new Point();
            int   lastTeam = -1;

            foreach (GamePlayer p in list)
            {
                temp = GetRandom(pos, temp, lastTeam, p.CurrentTeamIndex);
                tank.Players[p].X = temp.X;
                tank.Players[p].Y = temp.Y;
                tank.CurrentMap.AddPhysical(tank.Players[p]);
                p.CanFly = true;
                p.Count  = 2;

                data.WriteInt(p.PlayerCharacter.ID);
                data.WriteInt(tank.Players[p].X);
                data.WriteInt(tank.Players[p].Y);
                data.WriteInt(random.Next(0, 2) > 0 ? 1 : -1);
                data.WriteInt(tank.Players[p].Blood);
                data.WriteBoolean(game.Data.Players[p].IsCaptain);
                lastTeam = p.CurrentTeamIndex;
            }
            tank.CurrentIndex = player;
            game.BeginTimer(TIMEOUT);
            if (game.RoomType == eRoomType.PAIRUP && game.MatchGame != null)
            {
                game.MatchGame.StopTimer();
            }
        }
예제 #6
0
 public void  HandleCommand(BaseGame game, Player player, GSPacketIn packet)
 {
     if (game.GameState == eGameState.Loading)
     {
         player.LoadingProcess = packet.ReadInt();
         if (player.LoadingProcess >= 100)
         {
             game.CheckState(0);
         }
        var pkg = new GSPacketIn((short)ePackageType.GAME_CMD);
         pkg.WriteByte((byte)eTankCmdType.LOAD);
         //var pkg = packet.Clone();
       //  pkg.ClearContext();
         pkg.WriteInt(player.LoadingProcess);
         pkg.WriteInt(4);
         pkg.WriteInt(player.PlayerDetail.PlayerCharacter.ID);
         game.SendToAll(pkg);
     }
 }
예제 #7
0
        /*
        internal void SendAttackEffect(Living player, int type)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
            pkg.Parameter1 = player.Id;
            pkg.WriteByte((byte)eTankCmdType.ATTACKEFFECT);
            pkg.WriteBoolean(true);
            pkg.WriteInt(type);
            SendToAll(pkg);

        }
        */
        internal void SendSyncLifeTime()
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
            //pkg.Parameter2 = -1;
            pkg.WriteByte((byte)eTankCmdType.SYNC_LIFETIME);
            pkg.WriteInt(m_lifeTime);
            SendToAll(pkg);
        }
예제 #8
0
 internal void SendRemovePhysicalObj(PhysicalObj obj)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.DISAPPEAR);
     pkg.WriteInt(obj.Id);
     SendToAll(pkg);
     //TODO 完成删除物品
 }
예제 #9
0
 internal void SendPlayerUseProp(Player player, int type, int place, int templateID)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, player.Id);
     pkg.Parameter1 = player.Id;
     pkg.WriteByte((byte)eTankCmdType.PROP);
     pkg.WriteByte((byte)type);
     pkg.WriteInt(place);
     pkg.WriteInt(templateID);
     pkg.WriteInt(player.Id);//var _loc_7:* = _gameInfo.findLiving(_loc_2.readInt());
     pkg.WriteBoolean(false);//var _loc_8:* = _loc_2.readBoolean(); buff dan dat
     SendToAll(pkg);
 }
예제 #10
0
 internal void SendPlayerPicture(Living living, int type, bool state)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.Parameter1 = living.Id;
     pkg.WriteByte((byte)eTankCmdType.SEND_PICTURE);
     pkg.WriteInt(type);
     pkg.WriteBoolean(state);
     SendToAll(pkg);
     //(living as Player).PlayerDetail.SendTCP(pkg);
 }
예제 #11
0
 //, bool isLiving, string action) //string action
 internal void SendPlayerMove(Player player, int type, int x, int y, byte dir)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, player.Id);
     pkg.Parameter1 = player.Id;
     pkg.WriteByte((byte)eTankCmdType.MOVESTART);
     pkg.WriteByte((byte)type);
     pkg.WriteInt(x);
     pkg.WriteInt(y);
     pkg.WriteByte(dir);
     pkg.WriteBoolean(player.IsLiving);
     SendToAll(pkg);
 }
예제 #12
0
 internal void SendPhysicalObjFocus(Physics obj, int type)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.FOCUS_ON_OBJECT);
     pkg.WriteInt(type);
     pkg.WriteInt(obj.X);
     pkg.WriteInt(obj.Y);
     SendToAll(pkg);
 }
예제 #13
0
        internal void SendOpenSelectLeaderWindow(int maxTime)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);

            pkg.WriteByte((byte)eTankCmdType.GAME_CAPTAIN_AFFIRM);

            pkg.WriteInt(maxTime);
            SendToAll(pkg);
        }
예제 #14
0
 internal void SendGameWindPic(byte windId, byte[] windpic)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.WIND_PIC);
     pkg.WriteByte(windId);
     pkg.Write(windpic);
     SendToAll(pkg);
 }
예제 #15
0
 internal void SendGameUpdateWind(float wind)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.VANE);
     int _wind = (int)(wind * 10);
     pkg.WriteInt(_wind);
     pkg.WriteBoolean(_wind > 0);
     pkg.WriteByte(GetVane(_wind, 1));
     pkg.WriteByte(GetVane(_wind, 2));
     pkg.WriteByte(GetVane(_wind, 3));
     SendToAll(pkg);
 }
예제 #16
0
        public override void OnStopping(BaseSceneGame game, Game.Base.Packets.GSPacketIn pkg)
        {
            base.OnStopping(game, pkg);
            game.BeginTimer(TIMEOUT / 2);

            TankData data = game.Data;

            pkg.WriteByte((byte)data.Players.Count);

            int winTeam  = -1;
            int lastTeam = -1;

            data.killFlag = false;

            foreach (KeyValuePair <GamePlayer, Player> p in data.Players)
            {
                //if(p.Value.TotalHurt > 0)
                //{
                //    data.killFlag = true;
                //}

                if (winTeam == -1 && p.Value.Blood > 0)
                {
                    if (game.GameMode == eGameMode.FLAG)
                    {
                        if (p.Value.IsCaptain)
                        {
                            winTeam = p.Key.CurrentTeamIndex;
                            break;
                        }
                        else
                        {
                            lastTeam = p.Key.CurrentTeamIndex;
                        }
                    }
                    else
                    {
                        winTeam = p.Key.CurrentTeamIndex;
                        break;
                    }
                }
            }

            //if (!data.killFlag)
            //{
            //    game.BeginTimer(3000);
            //}

            if (winTeam == -1 && game.Data.CurrentIndex == null)
            {
                winTeam = lastTeam;
            }

            if (winTeam == -1)
            {
                if (game.Data.CurrentFire != null)
                {
                    winTeam = game.Data.CurrentFire.CurrentTeamIndex;
                }
                else
                {
                    winTeam = data.LastDead;
                }
            }

            int GP;

            //E等级差=(对方平均等级+5)-玩家等级;取值区间(1~9);
            //            P赢=4*[(对方平均等级+5)-玩家等级]+伤害的血量*0.2%+击杀数*2+(命中次数/玩家总的回合次数)*8;
            //P输=1*[(对方平均等级+5)-玩家等级]+伤害的血量*0.2%+击杀数*2+(命中次数/玩家总的回合次数)*8


            //            P赢=[2+伤害的血量*0.1%+击杀数*0.5+(命中次数/玩家总的回合次数)*2]*[(对方平均等级+10)-玩家等级]
            //P输=[伤害的血量*0.1%+击杀数*0.5+(命中次数/玩家总的回合次数)*2]*[(对方平均等级+10)-玩家等级];

//            P赢=[2+伤害的血量*0.1%+击杀数*0.5+(命中次数/玩家总的回合次数)*2]*对方平均等级*[1+(总击杀数-1)*33%]
//P输=[伤害的血量*0.1%+击杀数*0.5+(命中次数/玩家总的回合次数)*2]*对方平均等级*[1+(总击杀数-1)*33%]

            //P赢=[2+伤害的血量*0.1%+击杀数*0.5+(命中次数/玩家总的回合次数)*2]*对方平均等级*[0.9+(游戏开始时对方玩家人数-1)*30%]
            //P输=[伤害的血量*0.1%+击杀数*0.5+(命中次数/玩家总的回合次数)*2]*对方平均等级*[0.9+(游戏开始时对方玩家人数-1)*30%]


            //bool flag = data.GameStart.AddMinutes(1).CompareTo(DateTime.Now) > 0;
            string     winStr     = LanguageMgr.GetTranslation("Game.Server.SceneGames.OnStopping.Msg5");
            GamePlayer winPlayer  = null;
            string     loseStr    = LanguageMgr.GetTranslation("Game.Server.SceneGames.OnStopping.Msg5");
            GamePlayer losePlayer = null;

            foreach (KeyValuePair <GamePlayer, Player> p in data.Players)
            {
                if (game.RoomType == 0)
                {
                    p.Key.PlayerCharacter.CheckCount++;
                }
                else
                {
                    p.Key.PlayerCharacter.CheckCount += 2;
                }
                p.Key.Out.SendCheckCode();

                if (p.Value.TotalHurt > 0)
                {
                    data.killFlag = true;
                }

                if (game.GameClass == eGameClass.CONSORTIA)
                {
                    if (p.Key.CurrentTeamIndex == winTeam)
                    {
                        winStr   += " [" + p.Key.PlayerCharacter.NickName + "] ";
                        winPlayer = p.Key;
                    }
                    else
                    {
                        loseStr   += " [" + p.Key.PlayerCharacter.NickName + "] ";
                        losePlayer = p.Key;
                    }
                }
            }

            int riches = 0;

            if (game.GameClass == eGameClass.CONSORTIA)
            {
                winStr  += LanguageMgr.GetTranslation("Game.Server.SceneGames.OnStopping.Msg1") + losePlayer.PlayerCharacter.ConsortiaName + LanguageMgr.GetTranslation("Game.Server.SceneGames.OnStopping.Msg2");
                loseStr += LanguageMgr.GetTranslation("Game.Server.SceneGames.OnStopping.Msg3") + winPlayer.PlayerCharacter.ConsortiaName + LanguageMgr.GetTranslation("Game.Server.SceneGames.OnStopping.Msg4");
                riches   = ConsortiaMgr.ConsortiaFight(winPlayer.CurrentTeamIndex == 1 ? data.ConsortiaID1 : data.ConsortiaID2,
                                                       winPlayer.CurrentTeamIndex == 1 ? data.ConsortiaID2 : data.ConsortiaID1, game.Data.Players, game.RoomType, game.GameClass, data.persons[winPlayer.CurrentTeamIndex].TotalKillHealth);
                GameServer.Instance.LoginServer.SendConsortiaFight(winPlayer.PlayerCharacter.ConsortiaID, riches, winStr);
                //GameServer.Instance.LoginServer.SendConsortiaFight(losePlayer.PlayerCharacter.ConsortiaID, -riches, loseStr);
            }

            foreach (KeyValuePair <GamePlayer, Player> p in data.Players)
            {
                GP = 1;
                if (p.Value.State != TankGameState.LOSE)
                {
                    if (game.RoomType == eRoomType.PAIRUP)
                    {
                        p.Key.PlayerCharacter.Total++;
                    }

                    double level    = (data.TotalLevel - data.persons[p.Key.CurrentTeamIndex].TotalLevel) / (data.TotalPerson - data.persons[p.Key.CurrentTeamIndex].TeamPerson);
                    double disLevel = level + 10 - p.Key.PlayerCharacter.Grade;

                    if (p.Key.CurrentTeamIndex == winTeam)
                    {
                        if (game.RoomType == eRoomType.PAIRUP)
                        {
                            p.Key.PlayerCharacter.Win++;
                        }

                        //GP = (int)Math.Ceiling((((data.killFlag ? 2 : 0) + (double)p.Value.TotalHurt * 0.001 + p.Value.TotalKill * 0.5 + (p.Value.HitNum / (p.Value.BoutNum == 0 ? 1 : p.Value.BoutNum)) * 2) * level * (1 + (data.persons[p.Key.CurrentTeamIndex].TatolKill - 1) * 0.33)));
                        GP = (int)Math.Ceiling((((data.killFlag ? 2 : 0) + (double)p.Value.TotalHurt * 0.001 + p.Value.TotalKill * 0.5 + (p.Value.HitNum / (p.Value.BoutNum == 0 ? 1 : p.Value.BoutNum)) * 2) * level * (0.9 + (data.persons[p.Key.CurrentTeamIndex].TeamPerson - 1) * 0.3)));
                    }
                    else
                    {
                        GP = (int)Math.Ceiling(((double)p.Value.TotalHurt * 0.001 + p.Value.TotalKill * 0.5 + (p.Value.HitNum / (p.Value.BoutNum == 0 ? 1 : p.Value.BoutNum)) * 2) * level * (0.9 + (data.persons[p.Key.CurrentTeamIndex].TeamPerson - 1) * 0.3));
                    }

                    bool isMarried = false;
                    if (p.Key.PlayerCharacter.IsMarried)
                    {
                        foreach (GamePlayer q in data.Players.Keys)
                        {
                            if (q.PlayerCharacter.ID != p.Key.PlayerCharacter.ID)
                            {
                                if (q.CurrentTeamIndex == p.Key.CurrentTeamIndex && p.Key.PlayerCharacter.SpouseID == q.PlayerCharacter.ID)
                                {
                                    GP        = (int)(GP * 1.2);
                                    isMarried = true;
                                }
                            }
                        }
                    }

                    p.Key.QuestInventory.CheckWin(data.MapIndex, (int)game.GameMode, game.ScanTime, p.Value.IsCaptain,
                                                  data.persons[p.Key.CurrentTeamIndex].TeamPerson, data.TotalPerson - data.persons[p.Key.CurrentTeamIndex].TeamPerson, p.Key.CurrentTeamIndex == winTeam, game.GameClass == eGameClass.CONSORTIA, (int)game.RoomType, isMarried);


                    double AAS = AntiAddictionMgr.GetAntiAddictionCoefficient(p.Key.PlayerCharacter.AntiAddiction);
                    GP = (int)(GP * AAS);

                    GP  = (int)(GP * RateMgr.GetRate(eRateType.Experience_Rate));
                    GP *= p.Key.BuffInventory.GPMultiple();

                    if (game.RoomType != eRoomType.PAIRUP && (disLevel <= 0 || disLevel >= 20))
                    {
                        GP = 1;
                    }

                    if (AAS < 10E-6)
                    {
                        GP = 0;
                    }
                    else
                    {
                        if (GP < 1)
                        {
                            GP = 1;
                        }
                    }

                    p.Key.SetGP(GP);

                    Dictionary <int, int> requestItems = p.Key.QuestInventory.GetRequestItems();
                    List <MapGoodsInfo>   questItems   = Managers.MapMgr.GetQuestGoodsAll(data.MapIndex);
                    foreach (MapGoodsInfo questID in questItems)
                    {
                        if (requestItems.ContainsKey(questID.GoodsID) && requestItems[questID.GoodsID] > 0)
                        {
                            int total = random.Next(questID.Value + 1);
                            if (p.Key.CurrentTeamIndex != winTeam)
                            {
                                total = total / 2;
                            }
                            else if (total < 1)
                            {
                                total = 1;
                            }
                            if (total < 1)
                            {
                                continue;
                            }

                            int count             = requestItems[questID.GoodsID] > total ? total : requestItems[questID.GoodsID];
                            ItemTemplateInfo temp = Bussiness.Managers.ItemMgr.GetSingleGoods(questID.GoodsID);
                            p.Key.TempInventory.AddItemTemplate(temp, questID, count);
                            requestItems[questID.GoodsID] -= count;
                        }
                    }
                }

                //p.Value.IsTakeOut = true;
                pkg.WriteInt(p.Key.PlayerCharacter.ID);
                pkg.WriteBoolean(winTeam == p.Key.CurrentTeamIndex);
                pkg.WriteInt(p.Key.PlayerCharacter.Grade);
                pkg.WriteInt(p.Key.PlayerCharacter.GP);
                pkg.WriteInt((int)p.Value.TotalKill);
                pkg.WriteInt(p.Value.TotalHurt);
                pkg.WriteInt(GP);
                pkg.WriteInt((int)p.Value.HitNum);
                pkg.WriteInt((int)p.Value.BoutNum);
                pkg.WriteInt(p.Value.Offer);

                if (data.persons[p.Key.CurrentTeamIndex].TotalKillHealth > 0)
                {
                    p.Value.IsTakeOut = true;
                    if (p.Key.CurrentGame != null)
                    {
                        p.Key.CurrentGame.IsTakeOut = true;
                    }
                }
                pkg.WriteBoolean(p.Value.IsTakeOut);
            }

            pkg.WriteInt(riches);
            //pkg.WriteBoolean(data.killFlag);
            pkg.WriteInt(data.TotalPerson / 2);

            data.InsertGameInfo(game, winTeam);

            GamePlayer[] list = data.Players.Keys.ToArray();
            foreach (GamePlayer p in list)
            {
                if (data.Players[p].State == TankGameState.LOSE)
                {
                    data.Players.Remove(p);
                }
                else
                {
                    //data.Players[p].Reset();
                    //p.PropInventory.Clear();
                    //if (!killFlag)
                    //{
                    //    if (p.CurrentGame.GameState != eGameState.FREE)
                    //    {
                    //        p.CurrentGame.ShowArk(p.CurrentGame, p);
                    //    }
                    //}
                }
            }
        }
예제 #17
0
 internal void SendMissionTryAgain(int TryAgain)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.GAME_MISSION_TRY_AGAIN);
     pkg.WriteInt(TryAgain);
     SendToAll(pkg);
 }
예제 #18
0
 internal void SendIsLastMission(bool isLast)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.IS_LAST_MISSION);
     pkg.WriteBoolean(isLast);
     SendToAll(pkg);
 }
예제 #19
0
 internal void SendPetUseKill(Player player, int killId, bool isUse)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, player.Id);
     pkg.Parameter1 = player.Id;
     pkg.WriteByte((byte)eTankCmdType.PET_SKILL);
     pkg.WriteInt(killId);
     pkg.WriteBoolean(isUse);
     SendToAll(pkg);
 }
예제 #20
0
 internal void SendLivingBeat(Living living, Living target, int totalDemageAmount, string action, int livingCount, int attackEffect)
 {
     int dander = 0;
     if (target is Player)
     {
         Player p = target as Player;
         dander = p.Dander;
     }
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, living.Id);
     pkg.Parameter1 = living.Id;
     pkg.WriteByte((byte)eTankCmdType.LIVING_BEAT);
     pkg.WriteString(!string.IsNullOrEmpty(action) ? action : "");//action
     pkg.WriteInt(livingCount);//livingCount
     for (int i = 1; i <= livingCount; i++)
     {
         pkg.WriteInt(target.Id);//target
         pkg.WriteInt(totalDemageAmount);//damage
         pkg.WriteInt(target.Blood);//targetBlood
         pkg.WriteInt(dander);//dander
         pkg.WriteInt(attackEffect);//attackEffect
     }
     SendToAll(pkg);//, (target as Player).PlayerDetail);
 }
예제 #21
0
 internal void SendPhysicalObjPlayAction(PhysicalObj obj)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.UPDATE_BOARD_STATE);
     pkg.WriteInt(obj.Id);
     pkg.WriteString(obj.CurrentAction);
     SendToAll(pkg);
 }
예제 #22
0
        internal void SendLivingMoveTo(Living living, int fromX, int fromY, int toX, int toY, string action,int speed)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, living.Id);

            pkg.Parameter1 = living.Id;

            pkg.WriteByte((byte)eTankCmdType.LIVING_MOVETO);
            pkg.WriteInt(fromX);
            pkg.WriteInt(fromY);
            pkg.WriteInt(toX);
            pkg.WriteInt(toY);
            pkg.WriteInt(speed);
            pkg.WriteString(!string.IsNullOrEmpty(action) ? action : "");//怪物资源的动作
            pkg.WriteString("");
            SendToAll(pkg);
        }
예제 #23
0
 internal void SendPlayerMove(Player player, int type, int x, int y, byte dir, bool isLiving)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, player.PlayerDetail.PlayerCharacter.ID);
     pkg.Parameter1 = player.Id;
     pkg.WriteByte((byte)eTankCmdType.MOVESTART);
     pkg.WriteByte((byte)type);
     pkg.WriteInt(player.X);
     pkg.WriteInt(player.Y);
     pkg.WriteByte(dir);
     pkg.WriteBoolean(isLiving);
     if (type == 2)
     {
         //PickBoxAction
         //_loc_9 = _loc_2.readInt(); count box
         pkg.WriteInt(m_tempBox.Count);
         foreach(Box box in m_tempBox){
         //_loc_2.readInt(), _loc_2.readInt() pos(x,y);
         pkg.WriteInt(box.X);
         pkg.WriteInt(box.Y);
         }
     }
     SendToAll(pkg, player.PlayerDetail);
 }
예제 #24
0
        internal void SendLivingPlayMovie(Living living, string action)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, living.Id);

            pkg.Parameter1 = living.Id;

            pkg.WriteByte((byte)eTankCmdType.PLAY_MOVIE);//.LIVING_PLAYMOVIE
            pkg.WriteString(action);

            SendToAll(pkg);
        }
예제 #25
0
 internal void SendPlayerRemove(Player player)
 {
     //GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_PLAYER_EXIT, player.PlayerDetail.PlayerCharacter.ID);
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_ROOM, player.PlayerDetail.PlayerCharacter.ID);//GAME_PLAYER_EXIT
     pkg.WriteByte((byte)ePackageType.GAME_ROOM_REMOVEPLAYER);
     pkg.WriteInt(serverId);
     pkg.WriteInt(4);
     SendToAll(pkg, player.PlayerDetail);
 }
예제 #26
0
        internal void SendLivingRangeAttacking(Living living, Living target, int totalDemageAmount, string action,int livingCount)
        {
            int dander = 0;
            if (target is Player)
            {
                Player p = target as Player;
                dander = p.Dander;
            }
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, living.Id);
            pkg.Parameter1 = living.Id;

            pkg.WriteByte((byte)eTankCmdType.LIVING_RANGEATTACKING);
            pkg.WriteInt(livingCount);//livingCount
            for (int i = 1; i <= livingCount; i++)
            {
                pkg.WriteInt(living.Id);
                pkg.WriteInt(totalDemageAmount);
                pkg.WriteInt(target.Id);
                pkg.WriteInt(dander);//dander
                pkg.WriteInt(target.Blood);
            }
            SendToAll(pkg);
        }
예제 #27
0
 internal void SendRemoveLiving(int id)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.WriteByte((byte)eTankCmdType.DISAPPEAR);
     pkg.WriteInt(id);
     SendToAll(pkg);
     //TODO 完成删除物品
 }
예제 #28
0
        internal void SendLivingSay(Living living, string msg, int type)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, living.Id);

            pkg.Parameter1 = living.Id;

            pkg.WriteByte((byte)eTankCmdType.LIVING_SAY);
            pkg.WriteString(msg);
            pkg.WriteInt(type);
            SendToAll(pkg);
        }
예제 #29
0
        internal void SendStartLoading(int maxTime)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);

            pkg.WriteByte((byte)eTankCmdType.GAME_LOAD);
            pkg.WriteInt(maxTime);
            pkg.WriteInt(m_map.Info.ID);

            pkg.WriteInt(m_loadingFiles.Count);
            foreach (LoadingFileInfo file in m_loadingFiles)
            {
                pkg.WriteInt(file.Type);
                pkg.WriteString(file.Path);
                pkg.WriteString(file.ClassName);
            }
            pkg.WriteInt(1);//petSkill Count
            for (int i = 0; i < 1; i++)
            {
                pkg.WriteString("1");//_loc_7.pic = event.pkg.readUTF();
                pkg.WriteString("");//_loc_7.effect = event.pkg.readUTF();
            }
            SendToAll(pkg);
        }
예제 #30
0
 internal void SendLivingUpdateAngryState(Living living)
 {
     GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
     pkg.Parameter1 = living.Id;
     pkg.WriteByte((byte)eTankCmdType.CHANGE_STATE);//CHANGE_STATE
     pkg.WriteInt(living.State);
     SendToAll(pkg);
 }
예제 #31
0
        public bool HandleCommand(TankGameLogicProcessor process, GamePlayer player, GSPacketIn packet)
        {
            if (player.CurrentGame.Data.CurrentIndex == player && player.CurrentGame.Data.Players[player].State != TankGameState.DEAD)
            {
                if (player.CurrentGame.Data.CurrentFire == null)
                    player.CurrentGame.Data.CurrentFire = player;

                int x = packet.ReadInt();
                int y = packet.ReadInt();

                if (Math.Abs(player.CurrentGame.Data.Players[player].X - x) > 100)
                {
                    //player.Out.SendMessage(eMessageType.ALERT, LanguageMgr.GetTranslation("Game.Server.SceneGames.TankHandle"));
                    StatMgr.LogErrorPlayer(player.PlayerCharacter.ID, player.PlayerCharacter.UserName, player.PlayerCharacter.NickName,
     ItemRemoveType.FireError, player.CurrentGame.Data.Players[player].X.ToString() + " to " + x.ToString() + ",MapID:" + player.CurrentGame.Data.MapIndex);
                    player.Client.Disconnect();
                    return false; ;
                }

                int force = packet.ReadInt();
                int angle = packet.ReadInt();

                TankData data = player.CurrentGame.Data;
                Tile shape = Managers.BallMgr.FindTile(data.CurrentBall.ID);
                GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD, player.PlayerCharacter.ID);
                pkg.WriteByte((byte)TankCmdType.FIRE);
                pkg.WriteInt(data.AddBall);
                for (int i = 0; i < data.AddBall; i++)
                {
                    if (player.CurrentGame.Data.ReduceFireBombs)
                    {
                        if (data.IsFastSpeed())
                        {
                            StatMgr.LogErrorPlayer(player.PlayerCharacter.ID, player.PlayerCharacter.UserName, player.PlayerCharacter.NickName,
                                ItemRemoveType.FastError, "MapID:" + player.CurrentGame.Data.MapIndex);
                            player.Client.Disconnect();
                            return false; ;
                        }

                        data.FireLogin = true;
                        double reforce = 1;
                        int reangle = 0;
                        if (i == 1)
                        {
                            reforce = 0.9;
                            reangle = -5;
                        }
                        else if (i == 2)
                        {
                            reforce = 1.1;
                            reangle = 5;
                        }

                        int vx = (int)(force * reforce * Math.Cos((double)(angle + reangle) / 180 * Math.PI));
                        int vy = (int)(force * reforce * Math.Sin((double)(angle + reangle) / 180 * Math.PI));

                        data.PhyID++;

                        BombObject bomb = new BombObject(data.PhyID, BallMgr.GetBallType(data.CurrentBall.ID), data.Players[player], shape, data.CurrentBall.Radii, data.AddMultiple < 1,
                            data.CurrentBall.Mass, data.CurrentBall.Weight, data.CurrentBall.Wind, data.CurrentBall.DragIndex, data.BallPower);

                        bomb.SetXY(x, y);
                        bomb.setSpeedXY(vx, vy);
                        data.CurrentMap.AddPhysical(bomb);
                        pkg.WriteBoolean(bomb.IsHole);
                        pkg.WriteInt(bomb.Id);
                        pkg.WriteInt(x);
                        pkg.WriteInt(y);
                        pkg.WriteInt(vx);
                        pkg.WriteInt(vy);
                        pkg.WriteInt(bomb.Actions.Count);
                        foreach (BombAction action in bomb.Actions)
                        {
                            pkg.WriteInt(action.TimeInt);
                            pkg.WriteInt(action.Type);
                            pkg.WriteInt(action.Param1);
                            pkg.WriteInt(action.Param2);
                            pkg.WriteInt(action.Param3);
                            pkg.WriteInt(action.Param4);
                        }

                        data.SetRunTime((int)bomb.RunTime);
                    }
                }

                player.CurrentGame.SendToAll(pkg);

                data.FireLogin = false;
                if (data.Bombs || data.Players[player].State == TankGameState.DEAD)
                {
                    data.TotalDelay += data.CurrentBall.Delay;
                    process.SendArk(player.CurrentGame, player);
                    player.PropInventory.AddItemTemplate(PropItemMgr.GetRandomFightProp(data.MapIndex));
                    data.Players[player].SetDander(20);

                    process.SendPlayFinish(player.CurrentGame, player);
                    //GSPacketIn pkgMsg = new GSPacketIn((byte)ePackageType.GAME_CMD);
                    //pkgMsg.WriteByte((byte)TankCmdType.PLAYFINISH);
                    //pkgMsg.WriteInt(player.CurrentGame.Data.TurnNum);
                    //player.CurrentGame.SendToAll(pkgMsg);

                }
                return true;

            }
            return false;
        }
예제 #32
0
        internal void SendLivingUpdateDirection(Living living)
        {
            GSPacketIn pkg = new GSPacketIn((byte)ePackageType.GAME_CMD);
            pkg.Parameter1 = living.Id;
            pkg.WriteByte((byte)eTankCmdType.DIRECTION);
            pkg.WriteInt(living.Direction);

            SendToAll(pkg);
        }