#region clone attack case 2812: { var attackd = bitconverter.readuint(packet, 4); var clonecount = packet[8]; for (int i = 0; i < clonecount; i++) { var attackr = bitconverter.readuint(packet, 9 + (i * 4)); if (client.entity.myclones.count < clonecount) return; var attack = client.entity.attackpacket; if (attack == null) attack = new gamepackets.attack(true); attack.attacker = attackr; attack.attacked = attackd; if (client.entity.myclones.count == 0) return; if (attackd == client.entity.uid || client.entity.myclones.containskey(attackd)) return; mrhassan.database.spellinformation myspell = null; try { myspell = database.spelltable.getspell(client.spells[12090].id, client.spells[12090].level); } catch { myspell = database.spelltable.getspell(12090, 4); } entity clone = null; if (client.entity.myclones.trygetvalue(attackr, out clone)) { entity attacked = null; sobnpcspawn attackedsob = null; if (client.screen.trygetvalue(attackd, out attacked)) { uint damage = 0; var spell = database.spelltable.getspell(attack.magictype, (byte)attack.magiclevel); if (spell == null) spell = database.spelltable.getspell(12080, 0); if (attack.attacktype == gamepackets.attack.melee) { if (game.attacking.handle.canattack(client.entity, attacked, spell, true)) { damage = game.attacking.calculate.melee(client.entity, attacked, spell, ref attack); double power = (0.5); damage = (uint)((double)damage * power / 8); game.attacking.handle.receiveattack(clone, attacked, attack, ref damage, spell); attack.damage = damage; client.sendscreen(attack); } } else { if (game.attacking.handle.canattack(client.entity, attacked, spell, false)) { damage = game.attacking.calculate.magic(client.entity, attacked, spell, ref attack); double power = (0.5); damage = (uint)((double)damage * power / 8); game.attacking.handle.receiveattack(clone, attacked, attack, ref damage, spell); attack.damage = damage; client.sendscreen(attack); } } spelluse suse = new spelluse(true); suse.attacker = clone.uid; suse.spellid = spell.id; suse.spelllevel = spell.level; suse.x = attacked.x; suse.y = attacked.y; suse.effect1 = attack.effect1; suse.addtarget(attacked, damage, attack); client.sendscreen(suse, true); if (client.account.state == mrhassan.database.accounttable.accountstate.projectmanager) client.send(new message("clone attack with skill: " + spell.name, system.drawing.color.cadetblue, message.talk)); } else if (client.screen.trygetsob(attackd, out attackedsob)) { uint damage = 0; var spell = database.spelltable.getspell(attack.magictype, (byte)attack.magiclevel); if (spell == null) spell = database.spelltable.getspell(12080, 0); if (attack.attacktype == gamepackets.attack.melee) { if (game.attacking.handle.canattack(client.entity, attackedsob, null)) { damage = game.attacking.calculate.melee(client.entity, attackedsob, ref attack); double power = ((myspell.power / 100.0) / 100.0); damage = (uint)((double)damage * power); game.attacking.handle.receiveattack(clone, attackedsob, attack, damage, null); attack.damage = damage; client.sendscreen(attack); } } else { if (game.attacking.handle.canattack(client.entity, attackedsob, spell)) { damage = game.attacking.calculate.magic(client.entity, attackedsob, spell, ref attack); double power = ((myspell.power / 100.0) / 100.0); damage = (uint)((double)damage * power); game.attacking.handle.receiveattack(clone, attackedsob, attack, damage, spell); attack.damage = damage; client.sendscreen(attack); } } spelluse suse = new spelluse(true); suse.attacker = clone.uid; suse.spellid = spell.id; suse.spelllevel = spell.level; suse.x = attackedsob.x; suse.y = attackedsob.y; suse.effect1 = attack.effect1; suse.addtarget(attackedsob, damage, attack); client.sendscreen(suse, true); if (client.account.state == mrhassan.database.accounttable.accountstate.projectmanager) client.send(new message("clone attack with skill: " + spell.name, system.drawing.color.cadetblue, message.talk)); } } } break; } #endregion
case 12090:
#region shadowclone case 12090: { attacker.attackpacket = null; if (attacker.myclones.count > 0) { var clones = attacker.myclones.values.toarray(); for (int i = 0; i < clones.length; i++) { var item = clones[i]; if (item == null) continue; data data = new data(true); data.uid = item.uid; data.id = network.gamepackets.data.removeentity; attacker.owner.sendscreen(data); attacker.myclones[item.uid] = null; } attacker.myclones.clear(); } else { if (canusespell(spell, attacker.owner)) { preparespell(spell, attacker.owner); spelluse spelluse = new spelluse(true); spelluse.attacker = attacker.uid; spelluse.spellid = spell.id; spelluse.spelllevel = spell.level; spelluse.x = x; spelluse.y = y; attacker.addclone(3); if (spell.level >= 4) attacker.addclone(10003); foreach (var item in attacker.myclones.values) spelluse.addtarget(item, 0, attack); attacker.owner.sendscreen(spelluse, true); } } break; } #endregion
public void addclone(ushort cloneid)
public void addclone(ushort cloneid) { #region spawnpacket(10014) var entity = new entity(entityflag.entity, true); entity.monsterinfo = new monsterinformation(); monsterinformation.monsterinformations.trygetvalue(9003, out entity.monsterinfo); entity.owner = owner; entity.monsterinfo.owner = entity; entity.isclone = true; entity._name = "shadowclone"; entity.clan = name; entity.spawnpacket = new byte[8 + _names + _name.length + 36]; array.copy(spawnpacket, entity.spawnpacket, entity.spawnpacket.length); writestringlist(new list<string>() { "shadowclone", "", "", name, "" }, _names, entity.spawnpacket); entity.mesh = mesh; entity.hitpoints = 1; entity.uid = owner.map.clonecounter.next; entity.guildid = entity.guildrank = entity.action = 0; entity.countryid = enums.countryid.default; entity.statusflag = entity.statusflag2 = entity.statusflag3 = entity.statusflag4 = 0; writer.write((uint)0, game.conquerstructures.equipment.steed, entity.spawnpacket); writer.write((uint)0, game.conquerstructures.equipment.steedplus, entity.spawnpacket); writer.write((uint)0, game.conquerstructures.equipment.steedcolor, entity.spawnpacket); writer.write((uint)0, game.conquerstructures.equipment.mountarmor, entity.spawnpacket); writer.write((uint)0, game.conquerstructures.equipment.wing, entity.spawnpacket); writer.write((uint)0, game.conquerstructures.equipment.wingplus, entity.spawnpacket); entity.flowerrank = 0; entity.nobilityrank = conquerstructures.nobilityrank.serf; entity.class = entity.firstrebornclass = entity.secondrebornclass = entity.jiangtalent = entity.subclassesactive = entity.reborn = entity.level = entity.serverid = 0; writer.write((byte)2, 271, entity.spawnpacket); writer.write(cloneid, 272, entity.spawnpacket); entity.owneruid = uid; entity.jiangactive = false; writer.write((uint)0, 178, entity.spawnpacket); writer.write((uint)0, 182, entity.spawnpacket); writer.write((uint)0, 186, entity.spawnpacket); writer.write((uint)0, _unionexploits, entity.spawnpacket); writer.write((uint)0, _unionid, entity.spawnpacket); writer.write((uint)0, _unionrank, entity.spawnpacket); writer.write((uint)0, _uniontype, entity.spawnpacket); writer.write((uint)0, _mytitle, entity.spawnpacket); writer.write((uint)0, _mytitlescore, entity.spawnpacket); writer.write((uint)0, _mywing, entity.spawnpacket); entity.minattack = minattack; entity.maxattack = entity.magicattack = math.max(minattack, maxattack); entity.appearance = appearance; entity.mapid = owner.map.id; entity.sendupdates = true; #endregion spawnpacket(10014) #region pet(2035) msgpetinfo pet = new msgpetinfo(); pet.uid = entity.uid; pet.petid = cloneid; pet.pettype = 2; pet.mesh = mesh; pet.attackrange = (byte)attackrange; pet.x = x; pet.y = y; pet.name = "shadowclone"; owner.send(pet); #endregion pet(2035) myclones.add(entity.uid, entity); owner.sendscreen(entity.spawnpacket, true); owner.sendscreenspawn(entity, true); #region data(10010) data data = new data(true); data.uid = entity.uid; data.facing = entity.facing; data.id = data.addentity; data.wparam1 = entity.x; data.wparam2 = entity.y; owner.send(data); #endregion data(10010) }