Exemple #1
0
        public static void HandleDropMesos(Character chr, int amount)
        {
            //30 E8 03 00 00
            if (chr.AssertForHack(amount < 10, "Trying to drop less than 10 mesos") ||
                chr.AssertForHack(amount > 50000, "Trying to drop more than 50k mesos") ||
                chr.AssertForHack(amount > chr.Inventory.Mesos, "Trying to drop more mesos than he's got") ||
                chr.AssertForHack(chr.Room != null, "Trying to drop mesos while in a 'room'"))
            {
                InventoryPacket.NoChange(chr);
                return;
            }

            if (chr.IsGM && !chr.IsAdmin)
            {
                MessagePacket.SendNotice("You cannot drop mesos.", chr);
                InventoryPacket.NoChange(chr);
                return;
            }

            chr.AddMesos(-amount, true);
            Common.Tracking.MesosTransfer.PlayerDropMesos(chr.ID, amount, chr.MapID.ToString());

            chr.Field.DropPool.Create(Reward.Create(amount), chr.ID, 0, DropType.Normal, chr.ID, new Pos(chr.Position), chr.Position.X, 0, false, 0, false, true);
            // This shouldn't be required
            InventoryPacket.NoChange(chr);
        }
Exemple #2
0
        public static void HandleNPCChat(Character chr, Packet packet)
        {
            int npcId = packet.ReadInt();
            var Npc   = chr.Field.GetNPC(npcId);

            if (chr.AssertForHack(!chr.CanAttachAdditionalProcess, "Tried to chat to npc while not able to attach additional process"))
            {
                InventoryPacket.NoChange(chr);
                return;
            }

            // Npc doesnt exist
            if (Npc == null)
            {
                InventoryPacket.NoChange(chr);
                return;
            }

            int RealID = Npc.ID;

            if (!DataProvider.NPCs.TryGetValue(RealID, out NPCData npc))
            {
                return;
            }

            if (npc.Shop.Count > 0)
            {
                // It's a shop!
                chr.ShopNPCID = RealID;
                NpcPacket.SendShowNPCShop(chr, RealID);
            }
            else if (npc.Trunk > 0)
            {
                chr.TrunkNPCID = RealID;
                StoragePacket.SendShowStorage(chr, chr.TrunkNPCID);
            }
            else
            {
                Action <string> errorHandlerFnc = null;
                if (chr.IsGM)
                {
                    errorHandlerFnc = (script) =>
                    {
                        MessagePacket.SendNotice("Error compiling script '" + script + "'!", chr);
                    };
                }

                INpcScript NPC = null;
                if (NPC == null && npc.Quest != null)
                {
                    NPC = Server.Instance.TryGetOrCompileScript(npc.Quest, errorHandlerFnc);
                }
                if (NPC == null)
                {
                    NPC = Server.Instance.TryGetOrCompileScript(npc.ID.ToString(), errorHandlerFnc);
                }

                NpcChatSession.Start(RealID, NPC, chr);
            }
        }
Exemple #3
0
        public void SetHide(bool Hidden, bool init)
        {
            AdminPacket.Hide(this, Hidden);

            if (Hidden)
            {
                GMHideEnabled = true;
                if (!init)
                {
                    Field.RemovePlayer(this, true);
                }
            }
            else
            {
                if (GMLevel == 1)
                {
                    MessagePacket.SendNotice("GM interns cannot leave GM Hide.", this);
                    AdminPacket.Hide(this, true); //because client unhides you graphically when server rejects it
                }
                else
                {
                    GMHideEnabled = false;
                    if (!init)
                    {
                        Field.ShowPlayer(this, true);
                    }
                }
            }
        }
Exemple #4
0
        public void OnPlayerLoad(Packet packet)
        {
            var characterId = packet.ReadInt();

            ThreadContext.Properties["CharacterID"] = characterId;

            if (RedisBackend.Instance.HoldoffPlayerConnection(characterId))
            {
                Program.MainForm.LogAppend("Bouncing charid: " + characterId);
                SendConnectToServer(Server.Instance.PublicIP.GetAddressBytes(), Server.Instance.Port, true);
                return;
            }


            if (RedisBackend.Instance.PlayerIsMigrating(characterId, true) == false)
            {
                var msg = "Disconnecting because not migrating. Charid: " + characterId;
                Server.Instance.ServerTraceDiscordReporter.Enqueue(msg);
                Program.MainForm.LogAppend(msg);
                goto cleanup_and_disconnect;
            }


            var uId = Server.Instance.CharacterDatabase.UserIDByCharID(characterId);

            ThreadContext.Properties["UserID"] = uId;
            if (Server.Instance.CharacterDatabase.IsBanned(uId))
            {
                var msg = "Disconnecting because banned. Charid: " + characterId + ". Userid: " + uId;
                Server.Instance.ServerTraceDiscordReporter.Enqueue(msg);
                Program.MainForm.LogAppend(msg);
                goto cleanup_and_disconnect;
            }

            if (Server.Instance.CharacterDatabase.IsIpBanned(IP))
            {
                var msg = "Disconnecting because IP banned. Charid: " + characterId + ". Userid: " + uId + ". IP: " + IP;
                Server.Instance.ServerTraceDiscordReporter.Enqueue(msg);
                Program.MainForm.LogAppend(msg);
                goto cleanup_and_disconnect;
            }

            if (Server.Instance.CharacterList.ContainsKey(characterId))
            {
                var msg = "Disconnecting characterId " + characterId + " from IP " + IP + ". Already connected in this channel.";
                Server.Instance.ServerTraceDiscordReporter.Enqueue(msg);
                Program.MainForm.LogAppend(msg);
                goto cleanup_and_disconnect;
            }

            var character  = new Character(characterId);
            var loadResult = character.Load(IP);

            if (loadResult != Character.LoadFailReasons.None)
            {
                var msg = "Disconnected characterId " + characterId + " from IP " + IP + ". " + loadResult;
                Server.Instance.ServerTraceDiscordReporter.Enqueue(msg);
                Program.MainForm.LogAppend(msg);
                goto cleanup_and_disconnect;
            }

            Player.Character = character;
            character.Player = Player;

            StartLogging();

            Program.MainForm.LogAppend(character.Name + " connected from IP " + IP + ".");

            Program.MainForm.ChangeLoad(true);
            Server.Instance.CharacterList.Add(characterId, character);
            if (character.IsGM)
            {
                Server.Instance.StaffCharacters.Add(character);
            }
            Loaded = true;

            //have to load summons after he joins the map, so i have moved this from the load method -Exile
            if (Server.Instance.CCIngPlayerList.TryGetValue(character.ID, out var info))
            {
                Server.Instance.CCIngPlayerList.Remove(character.ID);
            }

            var ccPacket = info?.Item1;

            if (ccPacket != null)
            {
                character.PrimaryStats.DecodeForCC(ccPacket);
            }

            character.PrimaryStats.CheckHPMP();

            MapPacket.SendJoinGame(character);

            if (character.IsGM)
            {
                string glevel = character.GMLevel == 1 ? "(GM Intern)" : character.GMLevel == 2 ? "(GM)" : "(Admin)";
                MessagePacket.SendNotice("Your GM Level: " + character.GMLevel + " " + glevel + ". Undercover? " + (character.Undercover ? "Yes" : "No"), character);
            }

            if (character.IsGM && !character.Undercover)
            {
                character.TryActivateHide();
            }

            character.Field.AddPlayer(character);

            if (ccPacket != null)
            {
                character.Summons.DecodeForCC(ccPacket);
            }

            MessagePacket.SendText(MessagePacket.MessageTypes.Header, Server.Instance.ScrollingHeader, character, MessagePacket.MessageMode.ToPlayer);

            Server.Instance.CenterConnection.RegisterCharacter(character.ID, character.Name, character.PrimaryStats.Job, character.PrimaryStats.Level, character.GMLevel);

            Server.Instance.CenterConnection.RequestBuddyListLoad(character.Name, false, character.PrimaryStats.BuddyListCapacity); //Sends a packet that request the buddylistload from the centerserver
            character.IsOnline = true;
            Server.Instance.CenterConnection.PlayerUpdateMap(character);

            // Just to be sure, check if he was banned

            if (RedisBackend.Instance.TryGetNonGameHackDetect(Player.Character.UserID, out var hax))
            {
                HackDetected = hax;
                OnHackDetected();
            }
            else if (HackDetected.HasValue)
            {
                OnHackDetected();
            }

            return;


cleanup_and_disconnect:

            Server.Instance.CCIngPlayerList.Remove(characterId);
            Disconnect();
        }
Exemple #5
0
        public void OnVarset(Character Sent, string Var, object Value, object Value2 = null, object Value3 = null)
        {
            if (this != Sent && Sent.IsGM && !Sent.IsAdmin) //Todo Admin levels
            {
                MessagePacket.SendNotice("You don't have the premission to edit other players stats!", Sent);
                //$"{Sent.Name} tried to edit another players stats without premission"
            }
            else
            {
                try
                {
                    MapPacket.AvatarModFlag        AvatarMod = 0;
                    CharacterStatsPacket.StatFlags dwFlag    = 0;

                    switch (Var.ToLower())
                    {
                    case "hp":
                        dwFlag         |= CharacterStatsPacket.StatFlags.Hp;
                        PrimaryStats.HP = Convert.ToInt16(Value);
                        break;

                    case "mp":
                        dwFlag         |= CharacterStatsPacket.StatFlags.Mp;
                        PrimaryStats.MP = Convert.ToInt16(Value);
                        break;

                    case "exp":
                        dwFlag          |= CharacterStatsPacket.StatFlags.Exp;
                        PrimaryStats.EXP = Convert.ToInt32(Value);
                        break;

                    case "maxhp":
                        dwFlag |= CharacterStatsPacket.StatFlags.MaxHp;
                        if (Value.ToString() == "0")
                        {
                            Value = "1";
                        }
                        PrimaryStats.MaxHP = Convert.ToInt16(Value);
                        break;

                    case "maxmp":
                        dwFlag |= CharacterStatsPacket.StatFlags.MaxMp;
                        if (Value.ToString() == "0")
                        {
                            Value = "1";
                        }
                        PrimaryStats.MaxMP = Convert.ToInt16(Value);
                        break;

                    case "ap":
                        dwFlag         |= CharacterStatsPacket.StatFlags.Ap;
                        PrimaryStats.AP = Convert.ToInt16(Value);
                        break;

                    case "sp":
                        dwFlag         |= CharacterStatsPacket.StatFlags.Sp;
                        PrimaryStats.SP = Convert.ToInt16(Value);
                        break;

                    case "str":
                        dwFlag          |= CharacterStatsPacket.StatFlags.Str;
                        PrimaryStats.Str = Convert.ToInt16(Value);
                        break;

                    case "dex":
                        dwFlag          |= CharacterStatsPacket.StatFlags.Dex;
                        PrimaryStats.Dex = Convert.ToInt16(Value);
                        break;

                    case "int":
                        dwFlag          |= CharacterStatsPacket.StatFlags.Int;
                        PrimaryStats.Int = Convert.ToInt16(Value);
                        break;

                    case "luk":
                        dwFlag          |= CharacterStatsPacket.StatFlags.Luk;
                        PrimaryStats.Luk = Convert.ToInt16(Value);
                        break;

                    case "fame":
                    case "pop":
                        dwFlag           |= CharacterStatsPacket.StatFlags.Fame;
                        PrimaryStats.Fame = Convert.ToInt16(Value);
                        break;

                    case "mesos":
                        dwFlag         |= CharacterStatsPacket.StatFlags.Mesos;
                        Inventory.Mesos = Convert.ToInt32(Value);
                        break;

                    case "job":
                    {
                        var Job = Convert.ToInt16(Value);
                        if (DataProvider.HasJob(Job) || Job == 0)
                        {
                            dwFlag          |= CharacterStatsPacket.StatFlags.Job;
                            PrimaryStats.Job = Job;
                        }
                        else
                        {
                            MessagePacket.SendNotice($"Job {Job} does not exist.", Sent);
                        }
                        break;
                    }

                    case "skill":
                    {
                        var SkillID = Convert.ToInt32(Value);
                        if (DataProvider.Skills.TryGetValue(SkillID, out var Skill))
                        {
                            if (Value2 == null)
                            {
                                Value2 = Skill.MaxLevel;
                            }
                            Skills.SetSkillPoint(SkillID, Convert.ToByte(Value2), true);
                        }
                        else
                        {
                            MessagePacket.SendNotice($"Skill {SkillID} does not exist.", Sent);
                        }
                        break;
                    }

                    case "level":
                        dwFlag |= CharacterStatsPacket.StatFlags.Level;
                        Level   = Convert.ToByte(Value);
                        MapPacket.SendPlayerLevelupAnim(this);
                        break;

                    case "skin":
                    {
                        var SkinID = Convert.ToByte(Value);
                        if (SkinID >= 0 && SkinID < 6)
                        {
                            AvatarMod |= MapPacket.AvatarModFlag.Skin;
                            dwFlag    |= CharacterStatsPacket.StatFlags.Skin;
                            Skin       = SkinID;
                        }
                        else
                        {
                            MessagePacket.SendNotice($"Skin {SkinID} does not exist.", Sent);
                        }
                        break;
                    }

                    case "face":
                    {
                        var FaceID = Convert.ToInt32(Value);
                        if (DataProvider.Equips.ContainsKey(FaceID))
                        {
                            AvatarMod |= MapPacket.AvatarModFlag.Face;
                            dwFlag    |= CharacterStatsPacket.StatFlags.Eyes;
                            Face       = FaceID;
                        }
                        else
                        {
                            MessagePacket.SendNotice($"Face {FaceID} does not exist.", Sent);
                        }
                        break;
                    }

                    case "hair":
                    {
                        var HairID = Convert.ToInt32(Value);
                        if (DataProvider.Equips.ContainsKey(HairID))
                        {
                            AvatarMod |= MapPacket.AvatarModFlag.Equips;
                            dwFlag    |= CharacterStatsPacket.StatFlags.Hair;
                            Hair       = HairID;
                        }
                        else
                        {
                            MessagePacket.SendNotice($"Hair {HairID} does not exist.", Sent);
                        }
                        break;
                    }

                    case "gender":
                    {
                        Gender = ParseGenderString(Value.ToString());
                        Server.Instance.CharacterDatabase.RunQuery(
                            "UPDATE characters SET gender = @gender WHERE id = @id",
                            "@gender", Gender,
                            "@id", ID
                            );

                        MessagePacket.SendNotice($"Gender set to {(Gender == 0 ? "male" : (Gender == 2 ? "Unisex" : "female"))}. Please relog.", this);
                        break;
                    }

                    case "accgender":
                    {
                        var gender = ParseGenderString(Value.ToString());
                        Server.Instance.CharacterDatabase.RunQuery(
                            "UPDATE users SET gender = @gender WHERE ID = @id",
                            "@gender", gender,
                            "@id", UserID
                            );

                        MessagePacket.SendNotice($"Account gender set to {(gender == 0 ? "male" : (gender == 2 ? "Unisex" : "female"))}", this);
                        break;
                    }

                    case "map":
                    case "field":
                    {
                        var FieldID = Convert.ToInt32(Value);
                        if (DataProvider.Maps.ContainsKey(FieldID))
                        {
                            ChangeMap(FieldID);
                        }
                        else
                        {
                            MessagePacket.SendText(MessagePacket.MessageTypes.RedText, "Map not found.", this, MessagePacket.MessageMode.ToPlayer);
                        }
                        break;
                    }

                    default:
                        MessagePacket.SendNotice($"{Var} is not a valid Variable!", Sent);
                        return;
                    }

                    if (dwFlag != 0)
                    {
                        CharacterStatsPacket.SendUpdateStat(this, true, dwFlag);
                    }

                    if (AvatarMod != 0)
                    {
                        MapPacket.SendAvatarModified(this, AvatarMod);
                    }
                }
                catch (Exception ex)
                {
                    MessagePacket.SendNotice(ex.Message, Sent);
                }
            }
        }
Exemple #6
0
 public void OnPetVarset(string Var, string Value, bool Me)
 {
     MessagePacket.SendNotice("Did you hear a cat just now? That damn thing haunts me.", this);
 }