public static void AttackMonster_Req(InPacket lea, Client gc) { short CharacterID = lea.ReadShort(); short OriginalID = lea.ReadShort(); lea.ReadShort(); short Damage = lea.ReadShort(); short HitX = lea.ReadShort(); short HitY = lea.ReadShort(); short SkillID = lea.ReadShort(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); Monster Monster = Map.getMonsterByOriginalID(OriginalID); if (Monster == null) { return; } Monster.HP -= Damage; switch (SkillID) { case 10108: // 點穴定身 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 1; } break; case 10204: // 餵毒術 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 2; } break; case 10304: // 玄冰擊 case 10305: // 冰凍大地 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 5; } break; case 10306: // 矇蔽蝕眼 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 3; } break; default: //Log.Inform("[Attack Monster] SkillID = {0}", SkillID); break; } if (Monster.HP <= 0) { //if (Monster.IsAlive == false) // return; Monster.State = 9; Monster.Effect = 0; //map.Monster.Remove(Monster); Monster.IsAlive = false; chr.Exp += Monster.Exp; if (chr.Exp >= GameConstants.getExpNeededForLevel(chr.Level)) { chr.LevelUp(); } StatusPacket.UpdateExp(gc); // 加入要掉落物品 int Max_Count = 2; // 設定最大物品掉落數 int Current_Count = 0; foreach (Loot loot in MobFactory.Drop_Data) { if (Current_Count == Max_Count) { break; } if (loot.MobID == Monster.MonsterID) { if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < loot.Chance) { Monster.Drops.Add(new Drop(0, loot.ItemID, (short)Randomizer.Next(loot.MinimumQuantity, loot.MaximumQuantity))); Current_Count++; } } } // 加入要掉落靈魂 //【藍色鬼魂】能恢復20%的鬼力值 //【綠色鬼魂】能恢復40%的鬼力值 //【紅色鬼魂】累積憤怒計量值用,當憤怒計滿之後能轉為憤怒狀態,攻防都會*1.2倍 //【紫色鬼魂】能吸收到封印裝備,蒐集越多越能增加封印物合成的成功機率 // 無 : 1% // 9900001 : 20% // 9900002 : 19% // 9900003 : 20% // 9900004 : 40% int[] Soul = { 0, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, // 20% 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, // 19% 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, // 20% 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004 // 40% }; int rnd = Randomizer.Next(0, 100); if (rnd != 0) { Monster.Drops.Add(new Drop(0, Soul[rnd], 20)); } //int Max_Soul_Count = 1; // 設定最大物品掉落數 //int Current_Soul_Count = 0; //int[] Soul = new int[] { 15000, 250000, 800000, 650000 }; //for (int i = 1; i < 5; i++) //{ // if (Max_Soul_Count == Current_Soul_Count) // break; // if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < Soul[i-1]) // { // Monster.Drops.Add(new Drop(0, 9900001 + (i -1), 20)); // Current_Soul_Count++; // } //} short rndMoney = (short)(Monster.Exp + Randomizer.Next(6)); if (rndMoney != 0 && Monster.MonsterID != 1010002) // rndMoney != 0 (少數怪物未寫入經驗值) { Monster.Drops.Add(new Drop(0, InventoryType.getMoneyStyle(rndMoney), rndMoney)); // 錢 } for (int i = 0; i < Monster.Drops.Count; i++) { Monster.Drops[i].PositionX = Monster.PositionX; Monster.Drops[i].PositionY = Monster.PositionY - 50; //Item it = new Item(Monster.Drops[i].ItemID, 0x63, 0x63, Monster.Drops[i].Quantity); Monster.Drops[i].ID = Map.ObjectID; Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Monster.Drops[i].ItemID, Monster.Drops[i].Quantity)); Map.ObjectID++; } foreach (Character All in Map.Characters) { MapPacket.MonsterDrop(All.Client, Monster); } Monster.Drops.Clear(); } else { Monster.State = 7; if (chr.PlayerX < HitX && Monster.Direction == 1) { Monster.Direction = 0xFF; } else if (chr.PlayerX > HitX && Monster.Direction == 0xFF) { Monster.Direction = 1; } } foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, Damage, HitX, HitY); } if (Monster.State == 9 && Monster.tmr1 != null) { Monster.tmr1.Cancel(); Monster.tmr1 = null; return; } if (Monster.State == 9 && Monster.tmr2 != null) { Monster.tmr2.Cancel(); Monster.tmr2 = null; return; } if (Monster.State == 9 && Monster.tmr3 != null) { Monster.tmr3.Cancel(); Monster.tmr3 = null; return; } int r = Randomizer.Next(0, 2); if (r == 0 && Monster.Effect == 0 && Monster.State == 7 && Monster.AttackType != 0 && Monster.tmr1 == null) { Monster.tmr1 = new Delay(600, false, () => { if (Monster.State == 9) { Monster.tmr1.Cancel(); Monster.tmr2.Cancel(); Monster.tmr3.Cancel(); Monster.tmr1 = null; Monster.tmr2 = null; Monster.tmr3 = null; return; } Monster.State = 3; foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, 0, HitX, HitY); } Monster.tmr1 = null; if (Monster.State == 3 && Monster.tmr2 == null) { Monster.tmr2 = new Delay(500, false, () => { if (Monster.State == 9) { Monster.tmr1.Cancel(); Monster.tmr2.Cancel(); Monster.tmr3.Cancel(); Monster.tmr1 = null; Monster.tmr2 = null; Monster.tmr3 = null; return; } Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr2 = null; }); Monster.tmr2.Execute(); } }); Monster.tmr1.Execute(); } if ((r == 1 && Monster.Effect == 0 && Monster.State != 9) || (Monster.State != 9 && Monster.Effect == 0 && Monster.AttackType == 0)) { Monster.tmr2 = new Delay(500, false, () => { Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr2 = null; }); Monster.tmr2.Execute(); } if (Monster.Effect != 0) { Monster.tmr3 = new Delay(6000, false, () => { Monster.Effect = 0; Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr3 = null; }); Monster.tmr3.Execute(); } }
public static void AttackMonster_Req(InPacket lea, Client gc) { short CharacterID = lea.ReadShort(); short OriginalID = lea.ReadShort(); lea.ReadShort(); short Damage = lea.ReadShort(); short HitX = lea.ReadShort(); short HitY = lea.ReadShort(); short SkillID = lea.ReadShort(); var chr = gc.Character; Map Map = MapFactory.GetMap(chr.MapX, chr.MapY); Monster Monster = Map.getMonsterByOriginalID(OriginalID); if (Monster == null) { return; } Monster.HP -= Damage; switch (SkillID) { case 10108: // 點穴定身 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 1; } break; case 10204: // 餵毒術 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 2; } break; case 10304: // 玄冰擊 case 10305: // 冰凍大地 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 5; } break; case 10306: // 矇蔽蝕眼 if (Randomizer.Next(0, 2) == 0) { Monster.Effect = 3; } break; default: //Log.Inform("[Attack Monster] SkillID = {0}", SkillID); break; } if (Monster.HP <= 0) { //if (Monster.IsAlive == false) // return; Monster.State = 9; Monster.Effect = 0; //map.Monster.Remove(Monster); Monster.IsAlive = false; chr.Exp += Monster.Exp; if (chr.Exp >= GameConstants.getExpNeededForLevel(chr.Level)) { chr.LevelUp(); } StatusPacket.UpdateExp(gc); // 加入要掉落物品 int Max_Count = 2; // 設定最大物品掉落數 int Current_Count = 0; foreach (Loot loot in MobFactory.Drop_Data) { if (Current_Count == Max_Count) { break; } if (loot.MobID == Monster.MonsterID) { if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < loot.Chance) { Monster.Drops.Add(new Drop(0, loot.ItemID, (short)Randomizer.Next(loot.MinimumQuantity, loot.MaximumQuantity))); Current_Count++; } } } // join to drop soul // [Blue Ghost] can restore 20% of ghost power // [Green Ghost] Can restore 40% of Ghost Power // [Red Ghost] It is used to accumulate the measurement value of anger. When the anger is full, it can be turned into an anger state. The offense and defense will be 1.2 // [Purple Ghost] can absorb the seal equipment, the more you collect the more you can increase the success rate of the seal synthesis // None: 1% // 9900001: 20% // 9900002: 19% // 9900003: 20% // 9900004: 40% int[] Soul = { 0, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, 9900001, // 20% 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, 9900002, // 19% 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, 9900003, // 20% 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004, 9900004 // 40% }; int rnd = Randomizer.Next(0, 100); if (rnd != 0) { Monster.Drops.Add(new Drop(0, Soul[rnd], 20)); } //int Max_Soul_Count = 1; // 設定最大物品掉落數 //int Current_Soul_Count = 0; //int[] Soul = new int[] { 15000, 250000, 800000, 650000 }; //for (int i = 1; i < 5; i++) //{ // if (Max_Soul_Count == Current_Soul_Count) // break; // if ((Randomizer.Next(999999) / GameServer.Rates.Loot) < Soul[i-1]) // { // Monster.Drops.Add(new Drop(0, 9900001 + (i -1), 20)); // Current_Soul_Count++; // } //} short rndMoney = (short)(Monster.Exp + Randomizer.Next(6)); if (rndMoney != 0 && Monster.MonsterID != 1010002) // rndMoney != 0 (少數怪物未寫入經驗值) { Monster.Drops.Add(new Drop(0, InventoryType.getMoneyStyle(rndMoney), rndMoney)); // 錢 } for (int i = 0; i < Monster.Drops.Count; i++) { Monster.Drops[i].PositionX = Monster.PositionX; Monster.Drops[i].PositionY = Monster.PositionY - 50; //Item it = new Item(Monster.Drops[i].ItemID, 0x63, 0x63, Monster.Drops[i].Quantity); Monster.Drops[i].ID = Map.ObjectID; Map.Item.Add(Map.ObjectID, new Drop(Map.ObjectID, Monster.Drops[i].ItemID, Monster.Drops[i].Quantity)); Map.ObjectID++; } foreach (Character All in Map.Characters) { MapPacket.MonsterDrop(All.Client, Monster); } Monster.Drops.Clear(); } else { Monster.State = 7; if (chr.PlayerX < HitX && Monster.Direction == 1) { Monster.Direction = 0xFF; } else if (chr.PlayerX > HitX && Monster.Direction == 0xFF) { Monster.Direction = 1; } } foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, Damage, HitX, HitY); } if (Monster.State == 9 && Monster.tmr1 != null) { Monster.tmr1.Cancel(); Monster.tmr1 = null; return; } if (Monster.State == 9 && Monster.tmr2 != null) { Monster.tmr2.Cancel(); Monster.tmr2 = null; return; } if (Monster.State == 9 && Monster.tmr3 != null) { Monster.tmr3.Cancel(); Monster.tmr3 = null; return; } int r = Randomizer.Next(0, 2); if (r == 0 && Monster.Effect == 0 && Monster.State == 7 && Monster.AttackType != 0 && Monster.tmr1 == null) { Monster.tmr1 = new Delay(600, false, () => { if (Monster.State == 9) { Monster.tmr1.Cancel(); Monster.tmr2.Cancel(); Monster.tmr3.Cancel(); Monster.tmr1 = null; Monster.tmr2 = null; Monster.tmr3 = null; return; } Monster.State = 3; foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, CharacterID, 0, HitX, HitY); } Monster.tmr1 = null; if (Monster.State == 3 && Monster.tmr2 == null) { Monster.tmr2 = new Delay(500, false, () => { if (Monster.State == 9) { Monster.tmr1.Cancel(); Monster.tmr2.Cancel(); Monster.tmr3.Cancel(); Monster.tmr1 = null; Monster.tmr2 = null; Monster.tmr3 = null; return; } Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr2 = null; }); Monster.tmr2.Execute(); } }); Monster.tmr1.Execute(); } if ((r == 1 && Monster.Effect == 0 && Monster.State != 9) || (Monster.State != 9 && Monster.Effect == 0 && Monster.AttackType == 0)) { Monster.tmr2 = new Delay(500, false, () => { Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr2 = null; }); Monster.tmr2.Execute(); } if (Monster.Effect != 0) { Monster.tmr3 = new Delay(6000, false, () => { Monster.Effect = 0; Monster.State = (Monster.MoveType == 0 ? (byte)0 : (byte)1); foreach (Character All in Map.Characters) { MonsterPacket.spawnMonster(All.Client, Monster, 0, 0, 0, 0); } Monster.tmr3 = null; }); Monster.tmr3.Execute(); } }