public static void Char_Damage_Req(InPacket lea, Client c) { short Damage = lea.ReadShort(); var chr = c.Character; if (Damage < 0) { Damage = short.MaxValue; } chr.Hp -= Damage; if (chr.Hp <= 0) { chr.IsAlive = false; if (!(chr.MapX == 10 && chr.MapY == 60) && !(chr.MapX == 10 && chr.MapY == 61) && !(chr.MapX == 10 && chr.MapY == 62) && !(chr.MapX == 10 && chr.MapY == 63) && !(chr.MapX == 10 && chr.MapY == 64)) { chr.Exp -= (int)(GameConstants.getExpNeededForLevel(chr.Level) * 0.2); if (chr.Exp < 0) { chr.Exp = 0; } StatusPacket.UpdateExp(c); } MapPacket.userDead(c); if (chr.Competitor != null) { PvPPacket.PvPEnd(c, chr.Competitor.CharacterID); PvPPacket.PvPEnd(chr.Competitor.Client, chr.Competitor.CharacterID); chr.Competitor = null; chr.Competitor.Competitor = null; } chr.Hp = 1; chr.Mp = 1; } StatusPacket.UpdateHpMp(c, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); }
public static void Command_Req(InPacket lea, Client gc) { string[] cmd = lea.ReadString(60).Split(new[] { (char)0x20 }, StringSplitOptions.None); if (gc.Account.Master == 0 || cmd.Length < 1) { return; } var chr = gc.Character; Character victim = null; switch (cmd[0]) { case "//notice": if (cmd.Length != 2) { break; } foreach (Character all in MapFactory.AllCharacters) { GamePacket.getNotice(all.Client, 3, cmd[1]); } break; case "//item": if (cmd.Length != 2 && cmd.Length != 3) { break; } short Quantity = 1; if (cmd.Length == 3) { if (int.Parse(cmd[2]) > 100) { Quantity = 100; } else { Quantity = short.Parse(cmd[2]); } } if (InventoryType.getItemType(int.Parse(cmd[1])) == 1 || InventoryType.getItemType(int.Parse(cmd[1])) == 2) { Quantity = 1; } if (InventoryType.getItemType(int.Parse(cmd[1])) == 5) { return; } chr.Items.Add(new Item(int.Parse(cmd[1]), InventoryType.getItemType(int.Parse(cmd[1])), chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(int.Parse(cmd[1]))), Quantity)); InventoryHandler.UpdateInventory(gc, InventoryType.getItemType(int.Parse(cmd[1]))); break; case "//money": if (cmd.Length != 2) { break; } chr.Money = int.Parse(cmd[1]); InventoryPacket.getInvenMoney(gc, chr.Money, int.Parse(cmd[1])); break; case "//levelup": chr.LevelUp(); break; case "//gogo": if (cmd.Length != 3) { break; } MapPacket.warpToMapAuth(gc, true, short.Parse(cmd[1]), short.Parse(cmd[2]), short.Parse(cmd[3]), short.Parse(cmd[4])); break; case "//hp": if (cmd.Length != 2) { break; } short Hp = short.Parse(cmd[1]); if (Hp > short.MaxValue) { Hp = short.MaxValue; } chr.MaxHp = Hp; chr.Hp = Hp; StatusPacket.getStatusInfo(gc); break; case "//mp": short Mp = short.Parse(cmd[1]); if (Mp > short.MaxValue) { Mp = short.MaxValue; } chr.MaxMp = Mp; chr.Mp = Mp; StatusPacket.getStatusInfo(gc); break; case "//heal": chr.Hp = chr.MaxHp; chr.Mp = chr.MaxMp; chr.Fury = chr.MaxFury; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); break; case "//warp": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { chr.MapX = victim.MapX; chr.MapY = victim.MapY; chr.PlayerX = victim.PlayerX; chr.PlayerY = victim.PlayerY; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); } break; case "//ban": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { dynamic datum = new Datum("accounts"); victim.Client.Account.Banned = 7; victim.Client.Dispose(); } break; case "//save": for (int i = 0; i < MapFactory.AllCharacters.Count; i++) { if (chr.CharacterID == MapFactory.AllCharacters[i].CharacterID) { continue; } MapFactory.AllCharacters[i].Client.Dispose(); } //GameServer.IsAlive = false; break; case "//skillhack": break; case "//serverinfo": GamePacket.NormalNotice(gc, 1, "I: P:15101 U:1 E:1.00 D:1.00 M:1.00 G:1.00"); break; case "//come": case "//oxstate": break; case "//now": DateTime now = DateTime.Now; string nowtime = string.Format("Server Time Now : [{0}-{1}-{2} {3}:{4}:{5}]", now.Year, now.Month, now.Day.ToString("00.##"), now.Hour.ToString("00.##"), now.Minute.ToString("00.##"), now.Second.ToString("00.##")); GamePacket.NormalNotice(gc, 4, nowtime); break; case "//user": break; case "//serverdown": break; case "//test": GamePacket.getNotice(gc, 4, "Tes000t"); break; case "//expbuff": GamePacket.getNotice(gc, 1, "!@ExpEvent2@!"); break; case "//processlist": GamePacket.GmProcessList(gc); GamePacket.NormalNotice(gc, 4, "[GM] Process File has saved in game folder."); break; case "//gameinfo": GamePacket.GmGameInfo(gc); GamePacket.NormalNotice(gc, 4, "[GM] GAME_INFO has copied to your clipboard."); //[GM] Game Log has copied to your clipboard. break; default: break; } }
public static void PickupItem(InPacket lea, Client gc) { int OriginalID = lea.ReadInt(); int ItemID = lea.ReadInt(); lea.ReadInt(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); // 撿取靈魂 if (ItemID >= 9900001 && ItemID <= 9900004) { if (Map.getDropByOriginalID(OriginalID) == null) { return; } switch (ItemID) { case 9900001: // Blue chr.Mp += (short)(chr.MaxMp * 0.2); if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 9900002: // Green chr.Mp += (short)(chr.MaxMp * 0.4); if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 9900003: // Red int rnd = Randomizer.Next(3, 7); chr.Fury += (short)(chr.MaxFury / 100 * rnd); if (chr.Fury > chr.MaxFury) { chr.Fury = chr.MaxFury; } break; case 9900004: // Purple if (chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal] != null) { chr.Items[InventoryType.ItemType.Equip, (byte)InventoryType.EquipType.Seal].Spirit++; InventoryPacket.getInvenEquip(gc); } break; } StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } return; } // 撿取錢 if (ItemID >= 9800001 && ItemID <= 9800005) { if (Map.getDropByOriginalID(OriginalID) == null) { return; } chr.Money += Map.getDropByOriginalID(OriginalID).Quantity; InventoryPacket.getInvenMoney(gc, chr.Money, Map.getDropByOriginalID(OriginalID).Quantity); foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } return; } if (!Map.Item.ContainsKey(OriginalID)) { return; } byte Type = InventoryType.getItemType(ItemID); Item finditem = null; foreach (Item it in gc.Character.Items) { if (it.ItemID == ItemID) { finditem = it; } } if (((Type == (byte)InventoryType.ItemType.Spend3) || (Type == (byte)InventoryType.ItemType.Other4)) && (finditem != null) && (finditem.Quantity + Map.getDropByOriginalID(OriginalID).Quantity) <= 100) { // 合併消費物品跟其他物品 chr.Items[(InventoryType.ItemType)finditem.Type, finditem.Slot].Quantity += Map.getDropByOriginalID(OriginalID).Quantity; } else { byte Slot = gc.Character.Items.GetNextFreeSlot((InventoryType.ItemType)Type); Item oItem = new Item(ItemID, Type, Slot, Map.getDropByOriginalID(OriginalID).Quantity); chr.Items.Add(oItem); } foreach (Character All in Map.Characters) { InventoryPacket.ClearDropItem(All.Client, chr.CharacterID, OriginalID, ItemID); } Map.Item.Remove(OriginalID); UpdateInventory(gc, Type); }
public static void UseSpend_Req(InPacket lea, Client gc) { var chr = gc.Character; byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); Item Item = chr.Items.getItem(Type, Slot); Map map = MapFactory.GetMap(chr.MapX, chr.MapY); var use = ItemFactory.useData[Item.ItemID]; // 使用回復HP 跟 MP 的物品 switch (Item.ItemID) { case 8841006: // 全部還原本 int Recover = 0; Recover = Recover + (chr.Str - 3); Recover = Recover + (chr.Dex - 3); Recover = Recover + (chr.Vit - 3); Recover = Recover + (chr.Int - 3); chr.Str = 3; chr.Dex = 3; chr.Vit = 3; chr.Int = 3; chr.AbilityBonus += (short)Recover; StatusPacket.getStatusInfo(gc); break; case 8850011: // 回城符 switch (chr.MapX) { case 1: case 2: case 3: case 4: case 5: case 6: case 22: case 23: chr.MapX = 1; chr.MapY = 1; break; case 7: case 8: case 9: chr.MapX = 16; chr.MapY = 1; break; case 10: case 11: case 20: chr.MapX = 10; chr.MapY = 1; break; case 12: case 13: chr.MapX = 12; chr.MapY = 1; break; case 14: case 15: case 17: case 18: case 19: case 21: chr.MapX = 15; chr.MapY = 1; break; case 16: chr.MapX = 16; chr.MapY = 1; break; case 24: case 25: case 26: case 31: case 32: case 33: chr.MapX = 25; chr.MapY = 1; break; case 27: case 28: chr.MapX = 27; chr.MapY = 1; break; default: chr.MapX = 1; chr.MapY = 1; break; } chr.PlayerX = 0; chr.PlayerY = 0; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850021: // 清陰符 chr.MapX = 1; chr.MapY = 2; chr.PlayerX = 2955; chr.PlayerY = 1116; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850031: // 龍林符(龍林城) chr.MapX = 15; chr.MapY = 2; chr.PlayerX = 3600; chr.PlayerY = 1041; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850041: // 冥珠符 chr.MapX = 10; chr.MapY = 3; chr.PlayerX = 1645; chr.PlayerY = 899; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850051: // 古樂符 chr.MapX = 25; chr.MapY = 1; chr.PlayerX = 4237; chr.PlayerY = 1230; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850061: // 無名符 chr.MapX = 16; chr.MapY = 1; chr.PlayerX = 2005; chr.PlayerY = 1101; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8850071: // 龍林符(龍林客棧) chr.MapX = 12; chr.MapY = 1; chr.PlayerX = 1040; chr.PlayerY = 782; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; case 8890011: // 蠟燭 case 8890021: // 火把 InventoryPacket.UseSpendStart(gc, chr, chr.PlayerX, chr.PlayerY, Item.ItemID, (byte)InventoryType.ItemType.Spend3, Slot); break; case 8899017: // 逮巴符 chr.MapX = 27; chr.MapY = 1; chr.PlayerX = 2070; chr.PlayerY = 1330; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); break; default: switch (use.Type) { case 0: // 恢復鬼力 if ((chr.MaxMp > chr.Mp + use.Recover)) { chr.Mp += (short)use.Recover; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxMp - chr.Mp < use.Recover) { chr.Mp = chr.MaxMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 1: // 恢復鬼力(%) if ((chr.MaxMp > chr.Mp + chr.MaxMp * use.Recover / 100)) { chr.Mp += (short)(chr.MaxMp * use.Recover / 100); StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxMp - chr.Mp < chr.MaxMp * use.Recover / 100) { chr.Mp = chr.MaxMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 2: // 恢復體力 if ((chr.MaxHp > chr.Hp + use.Recover)) { chr.Hp += (short)use.Recover; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxHp - chr.Hp < use.Recover) { chr.Hp = chr.MaxHp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; case 3: // 恢復體力(%) if ((chr.MaxHp > chr.Hp + chr.MaxHp * use.Recover / 100)) { chr.Hp += (short)(chr.MaxHp * use.Recover / 100); StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } else if (chr.MaxHp - chr.Hp < chr.MaxHp * use.Recover / 100) { chr.Hp = chr.MaxHp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } break; default: break; } break; } chr.Items.Remove(Type, Slot, 1); UpdateInventory(gc, Type); }
public static void WarpToMapAuth_Req(InPacket lea, Client gc) { var chr = gc.Character; short MapX = lea.ReadShort(); short MapY = lea.ReadShort(); short PositionX = lea.ReadShort(); short PositionY = lea.ReadShort(); bool IsAvailableMap = true; if (chr.IsAlive == false) { StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); chr.IsAlive = true; switch (MapX) { case 1: case 2: case 3: case 4: case 5: case 6: case 22: case 23: MapX = 1; MapY = 1; break; case 7: case 8: case 9: MapX = 16; MapY = 1; break; case 10: case 11: case 20: MapX = 10; if ((chr.MapX == 10 && chr.MapY == 60) || (chr.MapX == 10 && chr.MapY == 61) || (chr.MapX == 10 && chr.MapY == 62) || (chr.MapX == 10 && chr.MapY == 63) || (chr.MapX == 10 && chr.MapY == 64)) { MapY = 60; } else { MapY = 1; } break; case 12: case 13: MapX = 12; MapY = 1; break; case 14: case 15: case 17: case 18: case 19: case 21: MapX = 15; MapY = 1; break; case 16: MapX = 16; MapY = 1; break; case 24: case 25: case 26: case 31: case 32: case 33: MapX = 25; MapY = 1; break; case 27: case 28: MapX = 27; MapY = 1; break; default: MapX = 1; MapY = 1; break; } PositionX = 0; PositionY = 0; } MapPacket.warpToMapAuth(gc, IsAvailableMap, MapX, MapY, PositionX, PositionY); }
public static void Command_Req(InPacket lea, Client gc) { string[] cmd = lea.ReadString(60).Split(new[] { (char)0x20 }, StringSplitOptions.None); if (gc.Account.Master == 0 || cmd.Length < 1) { return; } var chr = gc.Character; Character victim = null; switch (cmd[0]) { case "//1": case "//公告": case "//notice": if (cmd.Length != 2) { break; } foreach (Character all in MapFactory.AllCharacters) { GamePacket.getNotice(all.Client, 3, cmd[1]); } break; case "//item": if (cmd.Length != 2 && cmd.Length != 3) { break; } short Quantity = 1; if (cmd.Length == 3) { if (int.Parse(cmd[2]) > 100) { Quantity = 100; } else { Quantity = short.Parse(cmd[2]); } } if (InventoryType.getItemType(int.Parse(cmd[1])) == 1 || InventoryType.getItemType(int.Parse(cmd[1])) == 2) { Quantity = 1; } if (InventoryType.getItemType(int.Parse(cmd[1])) == 5) { return; } chr.Items.Add(new Item(int.Parse(cmd[1]), InventoryType.getItemType(int.Parse(cmd[1])), chr.Items.GetNextFreeSlot((InventoryType.ItemType)InventoryType.getItemType(int.Parse(cmd[1]))), Quantity)); InventoryHandler.UpdateInventory(gc, InventoryType.getItemType(int.Parse(cmd[1]))); break; case "//money": if (cmd.Length != 2) { break; } chr.Money = int.Parse(cmd[1]); InventoryPacket.getInvenMoney(gc, chr.Money, int.Parse(cmd[1])); break; case "//levelup": chr.LevelUp(); break; case "//gogo": if (cmd.Length != 3) { break; } MapPacket.warpToMapAuth(gc, true, short.Parse(cmd[1]), short.Parse(cmd[2]), -1, -1); break; case "//hp": if (cmd.Length != 2) { break; } short Hp = short.Parse(cmd[1]); if (Hp > short.MaxValue) { Hp = short.MaxValue; } chr.MaxHp = Hp; chr.Hp = Hp; StatusPacket.getStatusInfo(gc); break; case "//mp": short Mp = short.Parse(cmd[1]); if (Mp > short.MaxValue) { Mp = short.MaxValue; } chr.MaxMp = Mp; chr.Mp = Mp; StatusPacket.getStatusInfo(gc); break; case "//heal": chr.Hp = chr.MaxHp; chr.Mp = chr.MaxMp; chr.Fury = chr.MaxFury; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); break; case "//warp": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { chr.MapX = victim.MapX; chr.MapY = victim.MapY; chr.PlayerX = victim.PlayerX; chr.PlayerY = victim.PlayerY; MapPacket.warpToMapAuth(gc, true, chr.MapX, chr.MapY, chr.PlayerX, chr.PlayerY); } break; case "//ban": if (cmd.Length != 2) { break; } foreach (Character find in MapFactory.AllCharacters) { if (find.Name.Equals(cmd[1])) { victim = find; } } if (victim != null) { dynamic datum = new Datum("accounts"); victim.Client.Account.Banned = 1; victim.Client.Dispose(); } break; case "//save": for (int i = 0; i < MapFactory.AllCharacters.Count; i++) { if (chr.CharacterID == MapFactory.AllCharacters[i].CharacterID) { continue; } MapFactory.AllCharacters[i].Client.Dispose(); } //GameServer.IsAlive = false; break; case "//選擇正派": Quest Quest = new Quest(60); Quest.QuestState = 0x31; chr.Quests.Add(Quest); QuestPacket.getQuestInfo(gc, chr.Quests.getQuests()); chr.Items.Add(new Item(8990019, 4, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Other4))); break; case "//選擇邪派": Quest = new Quest(64); Quest.QuestState = 0x31; chr.Quests.Add(Quest); QuestPacket.getQuestInfo(gc, chr.Quests.getQuests()); chr.Items.Add(new Item(8990020, 4, chr.Items.GetNextFreeSlot(InventoryType.ItemType.Other4))); break; //case "//test": // PartyPacket.PartyInvite(gc); // break; //case "//test2": // PartyPacket.PartyInvite(gc, 1, 1); // break; //case "//test3": // PartyPacket.PartyInvite(gc, 1 , 0); // break; default: break; } }
public static void Game_Log_Req(InPacket lea, Client gc) { //int re = SearchBytes(lea.Content, new byte[] { 0x0 }); string[] data = lea.ReadString(0x100 /*re*/).Split(new[] { (char)0x20 }, StringSplitOptions.None); int encryptKey = int.Parse(data[1]); string username = data[2]; string password = data[4]; int selectCharacter = lea.ReadByte(); IPAddress hostid = lea.ReadIPAddress(); gc.SetAccount(new Account(gc)); try { gc.Account.Load(username); //var pe = new PasswordEncrypt(encryptKey); //string encryptPassword = pe.encrypt(gc.Account.Password, gc.RetryLoginCount > 0 ? password.ToCharArray() : null); if (password.Equals(gc.Account.Password)) { gc.Dispose(); Log.Error("Login Fail!"); } else { gc.Account.Characters = new List <Character>(); foreach (dynamic datum in new Datums("Characters").PopulateWith("id", "accountId = '{0}' ORDER BY position ASC", gc.Account.ID)) { Character character = new Character(datum.id, gc); character.Load(false); character.IP = hostid; gc.Account.Characters.Add(character); } gc.SetCharacter(gc.Account.Characters[selectCharacter]); } Log.Inform("Password = {0}", password); //Log.Inform("encryptKey = {0}", encryptKey); //Log.Inform("encryptPassword = {0}", encryptPassword); } catch (NoAccountException) { gc.Dispose(); Log.Error("Login Fail!"); } Character chr = gc.Character; chr.CharacterID = gc.CharacterID; MapFactory.AllCharacters.Add(chr); StatusPacket.UpdateHpMp(gc, 0, 0, 0, 0); GamePacket.FW_DISCOUNTFACTION(gc); StatusPacket.getStatusInfo(gc); InventoryPacket.getCharacterEquip(gc); SkillPacket.getSkillInfo(gc, chr.Skills.getSkills()); QuestPacket.getQuestInfo(gc, chr.Quests.getQuests()); GamePacket.getQuickSlot(gc, chr.Keymap); StoragePacket.getStoreInfo(gc); StoragePacket.getStoreMoney(gc); MapPacket.enterMapStart(gc); InventoryPacket.getInvenCash(gc); CashShopPacket.MgameCash(gc); CashShopPacket.GuiHonCash(gc); InventoryPacket.getInvenEquip(gc); InventoryPacket.getInvenEquip1(gc); InventoryPacket.getInvenEquip2(gc); InventoryPacket.getInvenSpend3(gc); InventoryPacket.getInvenOther4(gc); InventoryPacket.getInvenPet5(gc); }
public static void UseSkill_Req(InPacket lea, Client gc) { byte Type = lea.ReadByte(); byte Slot = lea.ReadByte(); byte Level = lea.ReadByte(); byte NumOfTargets = lea.ReadByte(); int Active = lea.ReadInt(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); if (Type == 0 || Type == 1 || Type == 2 || Type == 3 || Type == 4) { Skill Skill = null; foreach (Skill sl in chr.Skills.getSkills()) { if (sl.Type.Equals(Type) && sl.Slot.Equals(Slot) && sl.SkillLevel.Equals(Level)) { Skill = sl; } } switch (Skill.SkillID) { case 0: break; case 1: if (Skill.SkillLevel < 5) { chr.Mp -= 2; } else { chr.Mp -= 4; } break; case 2: break; case 3: if (Active == 1) { Delay ddl = new Delay(1, false, null); chr.SkillState.Add(Skill.SkillID, ddl); chr.SkillState[Skill.SkillID] = new Delay(8000, true, () => { int addHp = 0, addMp = 0; if ((chr.Hp + 8) < chr.MaxHp) { addHp = 8; } else { addHp = chr.MaxHp - chr.Hp; if (addHp > 8) { addHp = 8; } } if ((chr.Mp + 2) < chr.MaxMp) { addMp = 2; } else { addMp = chr.MaxMp - chr.Mp; if (addMp > 2) { addMp = 2; } } chr.Hp += (short)addHp; chr.Mp += (short)addMp; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); } ); chr.SkillState[Skill.SkillID].Execute(); } else { chr.SkillState[Skill.SkillID].Cancel(); chr.SkillState.Remove(Skill.SkillID); } break; case 4: chr.Mp -= (short)5; StatusPacket.UpdateHpMp(gc, chr.Hp, chr.Mp, chr.Fury, chr.MaxFury); break; case 10104: // 氣力轉換 chr.Hp -= (short)(5 * Skill.SkillLevel); chr.Mp += (short)(16 * Skill.SkillLevel); if (chr.Hp < 0) { chr.Hp = 0; } if (chr.Mp > chr.MaxMp) { chr.Mp = chr.MaxMp; } break; case 10107: // 狂暴怒氣 if (chr.SkillState.ContainsKey(10107)) { chr.SkillState[10107].Cancel(); } short Mp = 26; short Defense = (short)(chr.Defense * 0.03); short Attack = (short)(chr.Attack * 0.01); int Time = 33; switch (Skill.SkillLevel) { case 1: Mp = 26; Defense = (short)(chr.Defense * 0.03); Attack = (short)(chr.Attack * 0.01); Time = 33; break; case 2: Mp = 26; Defense = (short)(chr.Defense * 0.06); Attack = (short)(chr.Attack * 0.02); Time = 36; break; case 3: Mp = 26; Defense = (short)(chr.Defense * 0.09); Attack = (short)(chr.Attack * 0.03); Time = 39; break; case 4: Mp = 26; Defense = (short)(chr.Defense * 0.12); Attack = (short)(chr.Attack * 0.04); Time = 42; break; case 5: Mp = 26; Defense = (short)(chr.Defense * 0.15); Attack = (short)(chr.Attack * 0.05); Time = 45; break; case 6: Mp = 52; Defense = (short)(chr.Defense * 0.18); Attack = (short)(chr.Attack * 0.06); Time = 48; break; case 7: Mp = 52; Defense = (short)(chr.Defense * 0.21); Attack = (short)(chr.Attack * 0.07); Time = 51; break; case 8: Mp = 52; Defense = (short)(chr.Defense * 0.24); Attack = (short)(chr.Attack * 0.08); Time = 54; break; case 9: Mp = 52; Defense = (short)(chr.Defense * 0.27); Attack = (short)(chr.Attack * 0.09); Time = 57; break; case 10: Mp = 52; Defense = (short)(chr.Defense * 0.30); Attack = (short)(chr.Attack * 0.10); Time = 60; break; case 11: Mp = 78; Defense = (short)(chr.Defense * 0.33); Attack = (short)(chr.Attack * 0.11); Time = 63; break; case 12: Mp = 78; Defense = (short)(chr.Defense * 0.36); Attack = (short)(chr.Attack * 0.12); Time = 66; break; case 13: Mp = 78; Defense = (short)(chr.Defense * 0.39); Attack = (short)(chr.Attack * 0.13); Time = 69; break; case 14: Mp = 78; Defense = (short)(chr.Defense * 0.42); Attack = (short)(chr.Attack * 0.14); Time = 72; break; case 15: Mp = 78; Defense = (short)(chr.Defense * 0.45); Attack = (short)(chr.Attack * 0.15); Time = 75; break; case 16: Mp = 104; Defense = (short)(chr.Defense * 0.48); Attack = (short)(chr.Attack * 0.16); Time = 78; break; case 17: Mp = 104; Defense = (short)(chr.Defense * 0.51); Attack = (short)(chr.Attack * 0.17); Time = 81; break; case 18: Mp = 104; Defense = (short)(chr.Defense * 0.54); Attack = (short)(chr.Attack * 0.18); Time = 84; break; case 19: Mp = 104; Defense = (short)(chr.Defense * 0.57); Attack = (short)(chr.Attack * 0.19); Time = 87; break; case 20: Mp = 104; Defense = (short)(chr.Defense * 0.60); Attack = (short)(chr.Attack * 0.20); Time = 90; break; } chr.Mp -= Mp; if (chr.Mp < 0) { chr.Mp = 0; } if (!chr.SkillState.ContainsKey(10107)) { chr.Defense -= Defense; chr.MaxAttack += Attack; chr.Attack += Attack; chr.UpgradeAttack += Attack; if (chr.Defense < 0) { chr.Defense = 0; } chr.SkillAttack_10107 = Attack; chr.SkillDefense_10107 = Defense; chr.SkillState.Add(Skill.SkillID, null); StatusPacket.UpdateStat(gc); } chr.SkillState[Skill.SkillID] = new Delay(Time * 1000, false, () => { chr.Defense += Defense; chr.MaxAttack -= Attack; chr.Attack -= Attack; chr.UpgradeAttack -= Attack; chr.SkillState.Remove(10107); StatusPacket.UpdateStat(gc); }); chr.SkillState[Skill.SkillID].Execute(); break; case 10207: // 霧影術 chr.IsHiding = true; foreach (Character All in Map.Characters) { StatusPacket.Hide(All.Client, chr, 1); } break; case 10309: // 防護加持 if (chr.SkillState.ContainsKey(10309)) { chr.SkillState[10309].Cancel(); } Mp = 34; Defense = (short)(chr.Defense * 0.03); Time = 35; switch (Skill.SkillLevel) { case 1: Mp = 34; Defense = (short)(chr.Defense * 0.03); Time = 35; break; case 2: Mp = 34; Defense = (short)(chr.Defense * 0.06); Time = 40; break; case 3: Mp = 34; Defense = (short)(chr.Defense * 0.09); Time = 45; break; case 4: Mp = 34; Defense = (short)(chr.Defense * 0.12); Time = 50; break; case 5: Mp = 34; Defense = (short)(chr.Defense * 0.15); Time = 55; break; case 6: Mp = 68; Defense = (short)(chr.Defense * 0.18); Time = 60; break; case 7: Mp = 68; Defense = (short)(chr.Defense * 0.21); Time = 65; break; case 8: Mp = 68; Defense = (short)(chr.Defense * 0.24); Time = 70; break; case 9: Mp = 68; Defense = (short)(chr.Defense * 0.27); Time = 75; break; case 10: Mp = 68; Defense = (short)(chr.Defense * 0.30); Time = 80; break; case 11: Mp = 102; Defense = (short)(chr.Defense * 0.33); Time = 85; break; case 12: Mp = 102; Defense = (short)(chr.Defense * 0.36); Time = 90; break; case 13: Mp = 102; Defense = (short)(chr.Defense * 0.39); Time = 95; break; case 14: Mp = 102; Defense = (short)(chr.Defense * 0.42); Time = 100; break; case 15: Mp = 102; Defense = (short)(chr.Defense * 0.45); Time = 105; break; case 16: Mp = 136; Defense = (short)(chr.Defense * 0.48); Time = 110; break; case 17: Mp = 136; Defense = (short)(chr.Defense * 0.51); Time = 115; break; case 18: Mp = 136; Defense = (short)(chr.Defense * 0.54); Time = 120; break; case 19: Mp = 136; Defense = (short)(chr.Defense * 0.57); Time = 125; break; case 20: Mp = 136; Defense = (short)(chr.Defense * 0.60); Time = 130; break; } chr.Mp -= Mp; if (chr.Mp < 0) { chr.Mp = 0; } if (!chr.SkillState.ContainsKey(10309)) { chr.Defense += Defense; chr.UpgradeDefense += Defense; chr.SkillDefense_10309 = Defense; chr.SkillState.Add(Skill.SkillID, null); StatusPacket.UpdateStat(gc); } chr.SkillState[Skill.SkillID] = new Delay(Time * 1000, false, () => { chr.Defense -= Defense; chr.UpgradeDefense -= Defense; chr.SkillState.Remove(10309); StatusPacket.UpdateStat(gc); }); chr.SkillState[Skill.SkillID].Execute(); break; case 10310: // 陰陽幻移 chr.Hp += (short)(16 * Skill.SkillLevel); chr.Mp -= (short)(5 * Skill.SkillLevel); if (chr.Hp > chr.MaxHp) { chr.Hp = chr.MaxHp; } if (chr.Mp < 0) { chr.Mp = 0; } break; default: //Log.Inform("[Use Skill] SkillID = {0}", skill.SkillID); break; } } }