- Joined
- Apr 14, 2008
- Messages
- 24
- Reaction score
- 0
Venom 1 Damage Fix:
go to net -> channel -> handler -> AbstractDealDamagehandler.java
Replace:
with this:
then go to server -> life -> MapleMonster.java
Replace
with this
Papulatus and Pianus Monster spawn fix:
go to server -> life -> MobSkill.java
Replace everything with this
Monster Skills (stun, low accuracy, can't jump, can't move...)
goto server -> life -> MobAttackInfoFactory.java
Replace everything with this
go to net -> channel -> handler -> AbstractDealDamagehandler.java
Replace:
PHP:
ISkill venomNL = SkillFactory.getSkill(4120005);
ISkill venomShadower = SkillFactory.getSkill(4220005);
if (player.getSkillLevel(venomNL) > 0) {
MapleStatEffect venomEffect = venomNL.getEffect(player.getSkillLevel(venomNL));
for (int i = 0; i < attackCount; i++) {
if (venomEffect.makeChanceResult() == true) {
if (monster.getVenomMulti() < 3) {
monster.setVenomMulti((monster.getVenomMulti()+60));
MonsterStatusEffect monsterStatusEffect = new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.POISON, 1), venomNL, false);
monster.applyStatus(player, monsterStatusEffect, false, venomEffect.getDuration());
}
}
}
} else if (player.getSkillLevel(venomShadower) > 0) {
MapleStatEffect venomEffect = venomShadower.getEffect(player.getSkillLevel(venomShadower));
for (int i = 0; i < attackCount; i++) {
if (venomEffect.makeChanceResult() == true) {
if (monster.getVenomMulti() < 3) {
monster.setVenomMulti((monster.getVenomMulti()+60));
MonsterStatusEffect monsterStatusEffect = new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.POISON, 1), venomShadower, false);
monster.applyStatus(player, monsterStatusEffect, false, venomEffect.getDuration(), true);
}
}
}
}
PHP:
ISkill venomNL = SkillFactory.getSkill(4120005);
ISkill venomShadower = SkillFactory.getSkill(4220005);
if (player.getSkillLevel(venomNL) > 0) {
MapleStatEffect venomEffect = venomNL.getEffect(player.getSkillLevel(venomNL));
for (int i = 0; i < attackCount; i++) {
if (venomEffect.makeChanceResult() == true) {
if (monster.getVenomMulti() < 3) {
monster.setVenomMulti((monster.getVenomMulti()+1));
MonsterStatusEffect monsterStatusEffect = new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.POISON, 1), venomNL, false);
monster.applyStatus(player, monsterStatusEffect, false, venomEffect.getDuration(), true);
}
}
}
} else if (player.getSkillLevel(venomShadower) > 0) {
MapleStatEffect venomEffect = venomNL.getEffect(player.getSkillLevel(venomShadower));
for (int i = 0; i < attackCount; i++) {
if (venomEffect.makeChanceResult() == true) {
if (monster.getVenomMulti() < 3) {
monster.setVenomMulti((monster.getVenomMulti()+1));
MonsterStatusEffect monsterStatusEffect = new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.POISON, 1), venomShadower, false);
monster.applyStatus(player, monsterStatusEffect, false, venomEffect.getDuration(), true);
}
}
}
}
Replace
PHP:
} else if (venom) {
if (from.getJob() == MapleJob.NIGHTLORD || from.getJob() == MapleJob.SHADOWER) {
int poisonLevel = 0;
int matk = 0;
if (from.getJob() == MapleJob.NIGHTLORD) {
poisonLevel = from.getSkillLevel(SkillFactory.getSkill(4120005));
if (poisonLevel <= 0) {
return false;
}
matk = SkillFactory.getSkill(4120005).getEffect(poisonLevel).getMatk();
} else if (from.getJob() == MapleJob.SHADOWER) {
poisonLevel = from.getSkillLevel(SkillFactory.getSkill(4220005));
if (poisonLevel <= 0) {
return false;
}
matk = SkillFactory.getSkill(4220005).getEffect(poisonLevel).getMatk();
} else {
return false;
}
Random r = new Random();
int luk = from.getLuk();
int maxDmg = (int) Math.ceil(Math.min(Short.MAX_VALUE, 0.2 * luk * matk));
int minDmg = (int) Math.ceil(Math.min(Short.MAX_VALUE, 0.1 * luk * matk));
int gap = maxDmg - minDmg;
int poisonDamage = 0;
for (int i = 0; i < getVenomMulti(); i++) {
poisonDamage = poisonDamage + (r.nextInt(gap) + minDmg);
}
poisonDamage = Math.min(Short.MAX_VALUE, poisonDamage);
status.setValue(MonsterStatus.POISON, Integer.valueOf(poisonDamage));
status.setPoisonSchedule(timerManager.register(new PoisonTask(poisonDamage, from, status, cancelTask, false), 1000, 1000));
} else {
return false;
}
PHP:
} else if (venom) {
if (from.getJob() == MapleJob.NIGHTLORD || from.getJob() == MapleJob.SHADOWER) {
int poisonLevel = 0;
int matk = 0;
if (from.getJob() == MapleJob.NIGHTLORD) {
poisonLevel = from.getSkillLevel(SkillFactory.getSkill(4120005));
matk = SkillFactory.getSkill(4120005).getEffect(poisonLevel).getMatk();
} else if(from.getJob() == MapleJob.SHADOWER) {
poisonLevel = from.getSkillLevel(SkillFactory.getSkill(4220005));
matk = SkillFactory.getSkill(4220005).getEffect(poisonLevel).getMatk();
} else {
return false;
}
Random r = new Random();
int luk = from.getLuk();
int maxDmg = (int)Math.ceil(Math.min(Short.MAX_VALUE, 0.2 * luk * matk));
int minDmg = (int)Math.ceil(Math.min(Short.MAX_VALUE, 0.1 * luk * matk));
int gap = maxDmg - minDmg;
int poisonDamage = 0;
for (int i = 0; i < getVenomMulti(); i++) {
poisonDamage = poisonDamage + (r.nextInt(gap) + minDmg);
}
poisonDamage = Math.min(Short.MAX_VALUE, poisonDamage);
status.setValue(MonsterStatus.POISON, Integer.valueOf(poisonDamage));
status.setPoisonSchedule(timerManager.register(new PoisonTask(poisonDamage, from, status, cancelTask, false), 1000, 1000));
} else {
return false;
}
Papulatus and Pianus Monster spawn fix:
go to server -> life -> MobSkill.java
Replace everything with this
PHP:
package net.sf.odinms.server.life;
import java.awt.Point;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import net.sf.odinms.client.MapleCharacter;
import net.sf.odinms.client.MapleDisease;
import net.sf.odinms.client.status.MonsterStatus;
import net.sf.odinms.server.maps.MapleMapObject;
import net.sf.odinms.server.maps.MapleMapObjectType;
/**
*
* @author Danny (Leifde)
*/
public class MobSkill {
private int skillId;
private int skillLevel;
private int mpCon;
private MapleDisease diseaseType;
private List<Integer> toSummon = new ArrayList<Integer>();
private int spawnEffect;
private int hp;
private int x;
private int y;
private long duration;
private long cooltime;
private float prop;
private Point lt, rb;
private int limit;
public MobSkill(int skillId, int level) {
this.skillId = skillId;
this.skillLevel = level;
}
public void setMpCon(int mpCon) {
this.mpCon = mpCon;
}
public void setDiseaseType(MapleDisease diseaseType) {
this.diseaseType = diseaseType;
}
public void addSummons(List<Integer> toSummon) {
for (Integer summon : toSummon) {
this.toSummon.add(summon);
}
}
public void setSpawnEffect(int spawnEffect) {
this.spawnEffect = spawnEffect;
}
public void setHp(int hp) {
this.hp = hp;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setDuration(long duration) {
this.duration = duration;
}
public void setCoolTime(long cooltime) {
this.cooltime = cooltime;
}
public void setProp(float prop) {
this.prop = prop;
}
public void setLtRb(Point lt, Point rb) {
this.lt = lt;
this.rb = rb;
}
public void setLimit(int limit) {
this.limit = limit;
}
public void applyEffect(MapleCharacter player, MapleMonster monster, boolean skill) {
MonsterStatus monStat = null;
MapleDisease disease = null;
boolean heal = false;
boolean dispel = false;
switch (skillId) {
case 100:
case 110:
monStat = MonsterStatus.WEAPON_ATTACK_UP;
break;
case 101:
case 111:
monStat = MonsterStatus.MAGIC_ATTACK_UP;
break;
case 102:
case 112:
monStat = MonsterStatus.WEAPON_DEFENSE_UP;
break;
case 103:
case 113:
monStat = MonsterStatus.MAGIC_DEFENSE_UP;
break;
case 114: // Heal
heal = true;
break;
case 120:
disease = MapleDisease.SEAL;
break;
case 121:
disease = MapleDisease.DARKNESS;
break;
case 122:
disease = MapleDisease.WEAKEN;
break;
case 123:
disease = MapleDisease.STUN;
break;
case 124: // Curse
// TODO
break;
case 125:
disease = MapleDisease.POISON;
break;
case 126: // Slow
disease = MapleDisease.SLOW;
break;
case 127:
dispel = true;
break;
case 128: // Seduce
disease = MapleDisease.SEDUCE;
break;
case 129: // Banish?
// TODO
break;
case 140:
monStat = MonsterStatus.WEAPON_IMMUNITY;
break;
case 141:
monStat = MonsterStatus.MAGIC_IMMUNITY;
break;
case 200:
if (monster.getMap().getSpawnedMonstersOnMap() < 80) {
for (Integer mobId : getSummons()) {
MapleMonster toSpawn = MapleLifeFactory.getMonster(mobId);
toSpawn.setPosition(monster.getPosition());
int ypos, xpos;
xpos = (int)monster.getPosition().getX();
ypos = (int)monster.getPosition().getY();
switch (mobId)
{
case 8500003: //Pap bomb high
toSpawn.setFh((int)Math.ceil(Math.random() * 19.0));
ypos = -590;
case 8500004: //Pap bomb
//Spawn between -500 and 500 from the monsters X position
xpos = (int)(monster.getPosition().getX() + Math.ceil(Math.random() * 1000.0) - 500);
if (ypos != -590)
ypos = (int)monster.getPosition().getY();
break;
case 8510100: //Pianus bomb
if (Math.ceil(Math.random() * 5) == 1)
{
ypos = 78;
xpos = (int)(0 + Math.ceil(Math.random() * 5)) + ((Math.ceil(Math.random() * 2) == 1) ? 180 : 0);
}
else
xpos = (int)(monster.getPosition().getX() + Math.ceil(Math.random() * 1000.0) - 500);
break;
}
//Get spawn coordinates (This fixes monster lock)
//TODO get map left and right wall. Any suggestions? PM TheRamon
switch (monster.getMap().getId())
{
case 220080001: //Pap map
if (xpos < -890)
xpos = (int)(-890 + Math.ceil(Math.random() * 150));
else if (xpos > 230)
xpos = (int)(230 - Math.ceil(Math.random() * 150));
break;
case 230040420: //Pianus map
if (xpos < -239)
xpos = (int)(-239 + Math.ceil(Math.random() * 150));
else if (xpos > 371)
xpos = (int)(371 - Math.ceil(Math.random() * 150));
break;
}
toSpawn.setPosition(new Point(xpos, ypos));
monster.getMap().spawnMonsterWithEffect(toSpawn, getSpawnEffect(), toSpawn.getPosition());
}
}
break;
}
if (monStat != null || heal) {
if (lt != null && rb != null && skill) {
List<MapleMapObject> objects = getObjectsInRange(monster, MapleMapObjectType.MONSTER);
if (heal) {
for (MapleMapObject mons : objects) {
((MapleMonster) mons).heal(getX(), getY());
}
} else {
for (MapleMapObject mons : objects) {
((MapleMonster) mons).applyMonsterBuff(monStat, getX(), getSkillId(), getDuration(), this);
}
}
} else {
if (heal) {
monster.heal(getX(), getY());
} else {
monster.applyMonsterBuff(monStat, getX(), getSkillId(), getDuration(), this);
}
}
}
if (disease != null || dispel) {
if (lt != null && rb != null && skill) {
List<MapleMapObject> objects = getObjectsInRange(monster, MapleMapObjectType.PLAYER);
if (dispel) {
for (MapleMapObject chr : objects) {
((MapleCharacter) chr).dispel();
}
} else {
for (MapleMapObject chr : objects) {
((MapleCharacter) chr).giveDebuff(disease, this);
}
}
} else {
if (dispel) {
player.dispel();
} else {
player.giveDebuff(disease, this);
}
}
}
monster.usedSkill(skillId, skillLevel, cooltime);
monster.setMp(monster.getMp() - getMpCon());
}
public int getSkillId() {
return skillId;
}
public int getSkillLevel() {
return skillLevel;
}
public int getMpCon() {
return mpCon;
}
public List<Integer> getSummons() {
return Collections.unmodifiableList(toSummon);
}
public int getSpawnEffect() {
return spawnEffect;
}
public int getHP() {
return hp;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public long getDuration() {
return duration;
}
public long getCoolTime() {
return cooltime;
}
public Point getLt() {
return lt;
}
public Point getRb() {
return rb;
}
public int getLimit() {
return limit;
}
public boolean makeChanceResult() {
return prop == 1.0 || Math.random() < prop;
}
private Rectangle calculateBoundingBox(Point posFrom, boolean facingLeft) {
Point mylt;
Point myrb;
if (facingLeft) {
mylt = new Point(lt.x + posFrom.x, lt.y + posFrom.y);
myrb = new Point(rb.x + posFrom.x, rb.y + posFrom.y);
} else {
myrb = new Point(lt.x * -1 + posFrom.x, rb.y + posFrom.y);
mylt = new Point(rb.x * -1 + posFrom.x, lt.y + posFrom.y);
}
Rectangle bounds = new Rectangle(mylt.x, mylt.y, myrb.x - mylt.x, myrb.y - mylt.y);
return bounds;
}
private List<MapleMapObject> getObjectsInRange(MapleMonster monster, MapleMapObjectType objectType) {
Rectangle bounds = calculateBoundingBox(monster.getPosition(), monster.isFacingLeft());
List<MapleMapObjectType> objectTypes = new ArrayList<MapleMapObjectType>();
objectTypes.add(objectType);
return monster.getMap().getMapObjectsInBox(bounds, objectTypes);
}
}
Monster Skills (stun, low accuracy, can't jump, can't move...)
goto server -> life -> MobAttackInfoFactory.java
Replace everything with this
PHP:
package net.sf.odinms.server.life;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import net.sf.odinms.provider.MapleData;
import net.sf.odinms.provider.MapleDataProvider;
import net.sf.odinms.provider.MapleDataProviderFactory;
import net.sf.odinms.provider.MapleDataTool;
import net.sf.odinms.tools.Pair;
import net.sf.odinms.tools.StringUtil;
/**
*
* @author Danny (Leifde)
*/
public class MobAttackInfoFactory {
private static Map<Pair<Integer, Integer>, MobAttackInfo> mobAttacks = new HashMap<Pair<Integer, Integer>, MobAttackInfo>();
private static MapleDataProvider dataSource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("net.sf.odinms.wzpath") + "/Mob.wz"));
public static MobAttackInfo getMobAttackInfo(MapleMonster mob, int attack) {
MobAttackInfo ret = mobAttacks.get(new Pair<Integer, Integer>(Integer.valueOf(mob.getId()), Integer.valueOf(attack)));
if (ret != null) {
return ret;
}
synchronized (mobAttacks) {
// see if someone else that's also synchronized has loaded the skill by now
ret = mobAttacks.get(new Pair<Integer, Integer>(Integer.valueOf(mob.getId()), Integer.valueOf(attack)));
if (ret == null) {
MapleData mobData = dataSource.getData(StringUtil.getLeftPaddedStr(Integer.toString(mob.getId()) + ".img", '0', 11));
if (mobData != null) {
MapleData infoData = mobData.getChildByPath("info");
String linkedmob = MapleDataTool.getString("link", mobData, "");
if(!linkedmob.equals("")) {
mobData = dataSource.getData(StringUtil.getLeftPaddedStr(linkedmob + ".img", '0', 11));
}
MapleData attackData = mobData.getChildByPath("attack" + (attack + 1) + "/info");
if (attackData != null) {
MapleData deadlyAttack = attackData.getChildByPath("deadlyAttack");
int mpBurn = MapleDataTool.getInt("mpBurn", attackData, 0);
int disease = MapleDataTool.getInt("disease", attackData, 0);
int level = MapleDataTool.getInt("level", attackData, 0);
int mpCon = MapleDataTool.getInt("conMP", attackData, 0);
ret = new MobAttackInfo(mob.getId(), attack);
ret.setDeadlyAttack(deadlyAttack != null);
ret.setMpBurn(mpBurn);
ret.setDiseaseSkill(disease);
ret.setDiseaseLevel(level);
ret.setMpCon(mpCon);
}
}
mobAttacks.put(new Pair<Integer, Integer>(Integer.valueOf(mob.getId()), Integer.valueOf(attack)), ret);
}
return ret;
}
}
}