⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractdealdamagehandler.java

📁 冒险岛私服Java版服务端(Odinms)源代码。学习JAVA开发的朋友
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			if (player.getCheatTracker().getAttacksWithoutHit() > 100) {
				player.getCheatTracker().registerOffense(CheatingOffense.ATTACK_WITHOUT_GETTING_HIT,
					Integer.toString(player.getCheatTracker().getAttacksWithoutHit()));
			}
		}
	}

	private void handlePickPocket(MapleCharacter player, MapleMonster monster, Pair<Integer, List<Integer>> oned) {
		ISkill pickpocket = SkillFactory.getSkill(4211003);
		int delay = 0;
		int maxmeso = player.getBuffedValue(MapleBuffStat.PICKPOCKET).intValue();
		int reqdamage = 20000;
		Point monsterPosition = monster.getPosition();
		
		for (Integer eachd : oned.getRight()) {
			if (pickpocket.getEffect(player.getSkillLevel(pickpocket)).makeChanceResult()) {
				double perc = (double) eachd / (double) reqdamage;

				final int todrop = Math.min((int) Math.max(perc * (double) maxmeso, (double) 1),
					maxmeso);
				final MapleMap tdmap = player.getMap();
				final Point tdpos = new Point((int) (monsterPosition.getX() + (Math.random() * 100) - 50),
											  (int) (monsterPosition.getY()));
				final MapleMonster tdmob = monster;
				final MapleCharacter tdchar = player;

				TimerManager.getInstance().schedule(new Runnable() {
					public void run() {
						tdmap.spawnMesoDrop(todrop, todrop, tdpos, tdmob, tdchar, false);
					}
				}, delay);

				delay += 200;
			}
		}
	}

	private void checkHighDamage(MapleCharacter player, MapleMonster monster, AttackInfo attack, ISkill theSkill,
								MapleStatEffect attackEffect, int damageToMonster, int maximumDamageToMonster) {
		int elementalMaxDamagePerMonster;
		Element element = Element.NEUTRAL;
		if (theSkill != null) {
			element = theSkill.getElement();
		}
		if (player.getBuffedValue(MapleBuffStat.WK_CHARGE) != null) {
			int chargeSkillId = player.getBuffSource(MapleBuffStat.WK_CHARGE);
			switch (chargeSkillId) {
				case 1211003:
				case 1211004:
					element = Element.FIRE;
					break;
				case 1211005:
				case 1211006:
					element = Element.ICE;
					break;
				case 1211007:
				case 1211008:
					element = Element.LIGHTING;
					break;
			}
			ISkill chargeSkill = SkillFactory.getSkill(chargeSkillId);
			maximumDamageToMonster *= chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getDamage() / 100.0;
		}
		if (element != Element.NEUTRAL) {
			double elementalEffect;
			if (attack.skill == 3211003 || attack.skill == 3111003) { // inferno and blizzard
				elementalEffect = attackEffect.getX() / 200.0;
			} else {
				elementalEffect = 0.5;
			}
			switch (monster.getEffectiveness(element)) {
				case IMMUNE:
					elementalMaxDamagePerMonster = 1;
					break;
				case NORMAL:
					elementalMaxDamagePerMonster = maximumDamageToMonster;
					break;
				case WEAK:
					elementalMaxDamagePerMonster = (int) (maximumDamageToMonster * (1.0 + elementalEffect));
					break;
				case STRONG:
					elementalMaxDamagePerMonster = (int) (maximumDamageToMonster * (1.0 - elementalEffect));
					break;
				default:
					throw new RuntimeException("Unknown enum constant");
			}
		} else {
			elementalMaxDamagePerMonster = maximumDamageToMonster;
		}
		if (damageToMonster > elementalMaxDamagePerMonster) {
			player.getCheatTracker().registerOffense(CheatingOffense.HIGH_DAMAGE);
			// log.info("[h4x] Player {} is doing high damage to one monster: {} (maxdamage: {}, skill:
			// {})",
			// new Object[] { player.getName(), Integer.valueOf(totDamageToOneMonster),
			// Integer.valueOf(maxDamagePerMonster), Integer.valueOf(attack.skill) });
			if (damageToMonster > elementalMaxDamagePerMonster * 3) { // * 3 until implementation of lagsafe pingchecks for buff expiration
				AutobanManager.getInstance().autoban(player.getClient(), damageToMonster +
					" damage (level: " + player.getLevel() + " watk: " + player.getTotalWatk() +
					" skill: " + attack.skill + ", monster: " + monster.getId() + " assumed max damage: " +
					elementalMaxDamagePerMonster + ")");
			}
		}
	}

	public AttackInfo parseDamage(LittleEndianAccessor lea, boolean ranged) {
		AttackInfo ret = new AttackInfo();

		lea.readByte();
		ret.numAttackedAndDamage = lea.readByte();
		ret.numAttacked = (ret.numAttackedAndDamage >>> 4) & 0xF; // guess why there are no skills damaging more than
		// 15 monsters...
		ret.numDamage = ret.numAttackedAndDamage & 0xF; // how often each single monster was attacked o.o
		ret.allDamage = new ArrayList<Pair<Integer, List<Integer>>>();
		ret.skill = lea.readInt();
		lea.readByte(); // always 0 (?)
		ret.stance = lea.readByte();

		if (ret.skill == 4211006) {
			return parseMesoExplosion(lea, ret);
		}

		if (ranged) {
			lea.readShort();
			lea.readShort(); // somehow related to crits? this is the only value that changes between two otherwise
			// identical attacks
			// System.out.println(Integer.toBinaryString(wui & 0xFFFF) + "_" + Integer.toHexString(wui & 0xFFFF));
			lea.skip(7);
			// System.out.println("Unk1: " + HexTool.toString(lea.read(7)));
		} else {
			lea.skip(6);
		}

		// TODO we need information if an attack was a crit or not but it does not seem to be in this packet - find out
		// if it is o.o
		// noncrit strafe
		// 24 00 01 14 FE FE 30 00 00 97 04 06 99 2F EE 00 04 00 00 00 41 6B 00 00 00 06 81 00 01 00 00 5F 00 00 00 5F 00 D2 02 A3 19 00 00 43 0C 00 00 AD 0B 00 00 DB 12 00 00 64 00 5F 00
		//
		// fullcrit strafe:
		// 24 00 01 14 FE FE 30 00 00 97 04 06 F5 C3 EE 00 04 00 00 00 41 6B 00 00 00 06 81 00 01 00 00 5F 00 00 00 5F 00 D2 02 6E 0F 00 00 EA 12 00 00 58 15 00 00 56 11 00 00 64 00 5F 00

		for (int i = 0; i < ret.numAttacked; i++) {
			int oid = lea.readInt();
			// System.out.println("Unk2: " + HexTool.toString(lea.read(14)));
			lea.skip(14); // seems to contain some position info o.o

			List<Integer> allDamageNumbers = new ArrayList<Integer>();
			for (int j = 0; j < ret.numDamage; j++) {
				int damage = lea.readInt();
				// System.out.println("Damage: " + damage);
				allDamageNumbers.add(Integer.valueOf(damage));
			}
			ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(oid), allDamageNumbers));
		}

		// System.out.println("Unk3: " + HexTool.toString(lea.read(4)));
		return ret;
	}

	public AttackInfo parseMesoExplosion(LittleEndianAccessor lea, AttackInfo ret) {

		if (ret.numAttackedAndDamage == 0) {
			lea.skip(10);

			int bullets = lea.readByte();
			for (int j = 0; j < bullets; j++) {
				int mesoid = lea.readInt();
				lea.skip(1);
				ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(mesoid), null));
			}
			return ret;

		} else {
			lea.skip(6);
		}

		for (int i = 0; i < ret.numAttacked + 1; i++) {

			int oid = lea.readInt();

			if (i < ret.numAttacked) {
				lea.skip(12);
				int bullets = lea.readByte();

				List<Integer> allDamageNumbers = new ArrayList<Integer>();
				for (int j = 0; j < bullets; j++) {
					int damage = lea.readInt();
					// System.out.println("Damage: " + damage);
					allDamageNumbers.add(Integer.valueOf(damage));
				}
				ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(oid), allDamageNumbers));

			} else {

				int bullets = lea.readByte();
				for (int j = 0; j < bullets; j++) {
					int mesoid = lea.readInt();
					lea.skip(1);
					ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(mesoid), null));
				}
			}
		}

		return ret;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -