rendered paste body// spoil.java public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets) { if (!(activeChar instanceof L2PcInstance)) return; L2Object[] targetList = skill.getTargetList(activeChar); for (int index = 0; index < targetList.length; index++) { if (!(targetList[index] instanceof L2MonsterInstance)) continue; L2MonsterInstance target = (L2MonsterInstance) targetList[index]; // ootz0rz // matk/mdef based spoil? wth!? // boolean spoil = Formulas.getInstance().calcMagicAffected(activeChar, target, skill); // init vars boolean canSpoilLowerLevel = Config.CAN_SPOIL_LOWER_LEVEL_MOBS; boolean spoil = false; boolean wasNegative = false; double x = 0; double lvlDifference = 0; double rateOfSpoil = 0; double maxLevelDifference = Config.MAXIMUM_PLAYER_AND_MOB_LEVEL_DIFFERENCE; double baseRateOfSpoil = Config.BASE_SPOIL_RATE; double minimumRateOfSpoil = Config.MINIMUM_SPOIL_RATE; double spoilLevelLimit = Config.SPOIL_LEVEL_DIFFERENCE_LIMIT; int maxLevelOfSpoil = Config.LAST_LEVEL_SPOIL_IS_LEARNED; int mobLevel = target.getLevel(); int playerLevel = activeChar.getLevel(); int spoilCheck = 0; int spoilLevelANDPlayerLevelDifference = 0; Random rand = new Random(); consolePrint("SSS ------------------------"); consolePrint("SSS --- Spoil attempted by: "+activeChar.getName()+"("+playerLevel+") on monster: "+target.getName()+"("+mobLevel+")"); // first make sure target mob is alive if ( target.isDead() == false ) { // lvl diff lvlDifference = mobLevel - playerLevel; consolePrint("SSS --- LVL Diff: "+lvlDifference); // rate of spoil x = lvlDifference / maxLevelDifference; consolePrint("SSS --- X("+lvlDifference+"/"+maxLevelDifference+": "+x); if ( x < 0 ) { x *= -1; wasNegative = true; } if ( canSpoilLowerLevel == true && wasNegative ) { rateOfSpoil = baseRateOfSpoil; consolePrint("SSS --- rateOfSpoil[1.1]: "+rateOfSpoil); } else { if ( x > 1 ) x = 1; rateOfSpoil = baseRateOfSpoil * ( 1 - Math.pow(x, 2) ); consolePrint("SSS --- rateOfSpoil[1.2]: "+rateOfSpoil); // check for min rate if ( rateOfSpoil < minimumRateOfSpoil ) rateOfSpoil = minimumRateOfSpoil; } consolePrint("SSS --- rateOfSpoil[2]: "+rateOfSpoil); // now check for level of spoil skill if ( playerLevel > maxLevelOfSpoil ) playerLevel = maxLevelOfSpoil; consolePrint("SSS --- [1]skill.getId("+skill.getId()+")"); int classID = activeChar.getClassIDOnly(activeChar.getObjectId()); consolePrint("SSS --- [2]classID("+activeChar.getClassIDOnly(activeChar.getObjectId())+"): "+classID+""); consolePrint("SSS --- [3]skill.getLevel("+skill.getLevel()+")"); spoilCheck = SkillTreeTable.getMinSkillLevel(skill.getId(), classID, skill.getLevel()); consolePrint("SSS --- spoilCheck[1]("+skill.getId()+", "+classID+", "+skill.getLevel()+"): "+spoilCheck); spoilLevelANDPlayerLevelDifference = playerLevel - spoilCheck; if ( spoilLevelANDPlayerLevelDifference < 0 ) spoilLevelANDPlayerLevelDifference *= -1; consolePrint("SSS --- spoil/lvldiff[0]: "+spoilLevelANDPlayerLevelDifference); if ( spoilLevelANDPlayerLevelDifference > spoilLevelLimit ) { spoilLevelANDPlayerLevelDifference /= spoilLevelLimit; consolePrint("SSS --- spoil/lvldiff[1]: "+spoilLevelANDPlayerLevelDifference); if ( spoilLevelANDPlayerLevelDifference < 0 ) spoilLevelANDPlayerLevelDifference *= -1; if ( spoilLevelANDPlayerLevelDifference > 1 ) spoilLevelANDPlayerLevelDifference = 1; consolePrint("SSS --- spoil/lvldiff[2]: "+spoilLevelANDPlayerLevelDifference); double rateOfSpoilMultiplier = (baseRateOfSpoil * ( 1 - Math.pow(spoilLevelANDPlayerLevelDifference, 2) ))/100; consolePrint("SSS --- rateOfSpoilMultiplier: "+rateOfSpoilMultiplier); rateOfSpoil *= rateOfSpoilMultiplier; consolePrint("SSS --- rateOfSpoil[2b]: "+rateOfSpoil); if ( rateOfSpoil < minimumRateOfSpoil ) rateOfSpoil = minimumRateOfSpoil; consolePrint("SSS --- rateOfSpoil[2c]: "+rateOfSpoil); } consolePrint("SSS --- rateOfSpoil[3]: "+rateOfSpoil); // now do randomization int randomSuccessRate = rand.nextInt(99); if ( randomSuccessRate < rateOfSpoil ) spoil = true; consolePrint("SSS --- spoil success: "+spoil); consolePrint("SSS ------------------------"); } else { consolePrint("SSS --- TARGET IS DEAD! Set spoil to fail!"); consolePrint("SSS ------------------------"); } if (spoil) { target.activateSpoil(); activeChar.sendPacket(new SystemMessage(SystemMessage.SPOIL_SUCCESS)); } else { SystemMessage sm = new SystemMessage(614); sm.addString("Spoil failed"); activeChar.sendPacket(sm); } target.addDamageHate(activeChar, 0, (int)skill.getPower()); target.getAI().notifyEvent(CtrlEvent.EVT_ATTACKED, activeChar); activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target); } } //SkillTreeTable.java protected static void consolePrint(String text) { if ( Config.DEBUG == true ) System.out.println(text); } public static int getMinSkillLevel(int skillID, int classID, int skillLVL) { L2PcInstance player = null; java.sql.Connection con = null; int minLVL = 0; consolePrint("getMinSkillLevel --- class_id="+classID+" | skill_id="+skillID+" | level="+skillLVL+""); try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement("SELECT `min_level` FROM skill_trees WHERE class_id=? AND skill_id=? AND level=?"); statement.setInt(1, classID); statement.setInt(2, skillID); statement.setInt(3, skillLVL); consolePrint("getMinSkillLevel --- statement: (SELECT `min_level` FROM skill_trees WHERE class_id="+classID+" AND skill_id="+skillID+" AND level="+skillLVL+")"); ResultSet rset = statement.executeQuery(); consolePrint("getMinSkillLevel --- rset: ("+rset+")"); while (rset.next()) { minLVL = rset.getInt("min_level"); consolePrint("getMinSkillLevel --- min_level("+rset.getInt("min_level")+"): ("+minLVL+")"); break; } rset.close(); statement.close(); } catch (Exception e) { _log.log(Level.WARNING, "could not get char data:", e); } finally { try { con.close(); } catch (Exception e) {} } consolePrint("getMinSkillLevel --- return: ("+minLVL+")"); return minLVL; }//L2Character.java public int getClassIDOnly(int objectId) { L2PcInstance player = null; java.sql.Connection con = null; int classId = 0; consolePrint("getClassIDOnly --- Lookup objectId: ("+objectId+")"); try { con = L2DatabaseFactory.getInstance().getConnection(); PreparedStatement statement = con.prepareStatement("SELECT `classid` FROM characters WHERE obj_id=?"); statement.setInt(1, objectId); consolePrint("getClassIDOnly --- statement: (SELECT `classid` FROM characters WHERE obj_id="+objectId+")"); ResultSet rset = statement.executeQuery(); consolePrint("getClassIDOnly --- rset: ("+rset+")"); while (rset.next()) { classId = rset.getInt("classid"); consolePrint("getClassIDOnly --- classId("+rset.getInt("classid")+"): ("+classId+")"); break; } rset.close(); statement.close(); } catch (Exception e) { _log.log(Level.WARNING, "could not get char data:", e); } finally { try { con.close(); } catch (Exception e) {} } consolePrint("getClassIDOnly --- return: ("+classId+")"); return classId; }