[Release] Progressive Rebirths
Quote:
Originally Posted by Generic
As per Request of :
http://www.valhalladev.com/forum/ide...-rebirths.html
Replace your TakeDamageHandler with
Code:
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License version 3
as published by the Free Software Foundation. You may not use, modify
or distribute this program under any other version of the
GNU Affero General Public License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.odinms.net.channel.handler;
import java.util.Collections;
import net.sf.odinms.client.ISkill;
import net.sf.odinms.client.MapleBuffStat;
import net.sf.odinms.client.MapleCharacter;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.client.SkillFactory;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.server.AutobanManager;
import net.sf.odinms.server.life.MapleMonster;
import net.sf.odinms.server.life.MobAttackInfo;
import net.sf.odinms.server.life.MobAttackInfoFactory;
import net.sf.odinms.server.life.MobSkill;
import net.sf.odinms.server.life.MobSkillFactory;
import net.sf.odinms.server.maps.MapleMapObject;
import net.sf.odinms.server.maps.MapleMapObjectType;
import net.sf.odinms.server.maps.MapleMist;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
public class TakeDamageHandler extends AbstractMaplePacketHandler {
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
// damage from map object
// 26 00 EB F2 2B 01 FE 25 00 00 00 00 00
// damage from monster
// 26 00 0F 60 4C 00 FF 48 01 00 00 B5 89 5D 00 CC CC CC CC 00 00 00 00
MapleCharacter player = c.getPlayer();
slea.readInt();
int damagefrom = slea.readByte();
slea.readByte();
int damage = slea.readInt();
int oid = 0;
int monsteridfrom = 0;
int pgmr = 0;
int direction = 0;
int pos_x = 0;
int pos_y = 0;
int fake = 0;
boolean is_pgmr = false;
boolean is_pg = true;
int mpattack = 0;
MapleMonster attacker = null;
if (damagefrom != -2) {
monsteridfrom = slea.readInt();
oid = slea.readInt();
attacker = (MapleMonster) player.getMap().getMapObject(oid);
direction = slea.readByte();
}
if (damagefrom != -1 && damagefrom != -2 && attacker != null) {
MobAttackInfo attackInfo = MobAttackInfoFactory.getMobAttackInfo(attacker, damagefrom);
if (attackInfo.isDeadlyAttack()) {
mpattack = player.getMp() - 1;
}
mpattack += attackInfo.getMpBurn();
MobSkill skill = MobSkillFactory.getMobSkill(attackInfo.getDiseaseSkill(), attackInfo.getDiseaseLevel());
if (skill != null && damage > 0) {
skill.applyEffect(player, attacker, false);
}
if (attacker != null) {
attacker.setMp(attacker.getMp() - attackInfo.getMpCon());
if (damage > 0 && !attacker.isBoss()) {
ISkill manaReflectSkill = null;
Integer manaReflectSkillLevel = 0;
switch (player.getJob().getId()) {
case 212:
manaReflectSkill = SkillFactory.getSkill(2121002);
manaReflectSkillLevel = player.getSkillLevel(SkillFactory.getSkill(2121002));
break;
case 222:
manaReflectSkill = SkillFactory.getSkill(2221002);
manaReflectSkillLevel = player.getSkillLevel(SkillFactory.getSkill(2221002));
break;
case 232:
manaReflectSkill = SkillFactory.getSkill(2321002);
manaReflectSkillLevel = player.getSkillLevel(SkillFactory.getSkill(2321002));
break;
}
if (player.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && manaReflectSkillLevel != 0 && manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).makeChanceResult()) {
int bouncedamage = (int) (damage * (manaReflectSkill.getEffect(manaReflectSkillLevel).getX() / 100));
if (bouncedamage > attacker.getMaxHp() * 0.2) {
bouncedamage = (int) (attacker.getMaxHp() * 0.2);
}
player.getMap().damageMonster(player, attacker, bouncedamage);
player.getMap().broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), true, true);
player.getClient().getSession().write(MaplePacketCreator.showOwnBuffEffect(2221002, 5));
player.getMap().broadcastMessage(player, MaplePacketCreator.showBuffeffect(player.getId(), 2221002, 5), false);
}
}
}
}
if (damage == -1) {
int job = (int) (player.getJob().getId() / 10 - 40);
fake = 4020002 + (job * 100000);
}
if (damage < -1 || damage > 60000) {
AutobanManager.getInstance().addPoints(c, 1000, 60000, "Taking abnormal amounts of damge from " + monsteridfrom + ": " + damage);
return;
}
player.getCheatTracker().checkTakeDamage();
if (damage > 0) {
player.getCheatTracker().setAttacksWithoutHit(0);
player.getCheatTracker().resetHPRegen();
}
boolean smokescreen = false;
for (MapleMapObject mmo : player.getMap().getMapObjects()) {
if (mmo instanceof MapleMist) {
MapleMist mist = (MapleMist) mmo;
if (mist.getSourceSkill().getId() == 4221006) { // Smokescreen
for (MapleMapObject mmoplayer : player.getMap().getMapObjectsInBox(mist.getBox(), Collections.singletonList(MapleMapObjectType.PLAYER))) {
if (player == (MapleCharacter) mmoplayer) {
smokescreen = true;
}
}
}
}
}
if (damage > 0 && !player.isHidden() && !smokescreen) {
if (damagefrom == -1) {
Integer pguard = player.getBuffedValue(MapleBuffStat.POWERGUARD);
if (pguard != null) {
attacker = (MapleMonster) player.getMap().getMapObject(oid);
if (attacker != null && !attacker.isBoss()) {
int bouncedamage = (int) (damage * (pguard.doubleValue() / 100));
bouncedamage = Math.min(bouncedamage, attacker.getMaxHp() / 10);
player.getMap().damageMonster(player, attacker, bouncedamage);
damage -= bouncedamage;
player.getMap().broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), false, true);
player.checkMonsterAggro(attacker);
}
}
}
if (damagefrom != -2) {
if(player.getRebirths > 0) {
int rebirths = player.getRebirths();
//Try some balancing
// 1 Rebirth = 20% more damage
// 2 Rebirths = 35% more damage
// 3 Rebirths = 50% more damage
int newpercent = (int)((rebirths * 15) + 5) + 100; // + 100 to make it a percent to just multiply
damage = damage % newpercent;
}
Integer achilles = 0;
ISkill achilles1 = null;
switch (player.getJob().getId()) {
case 112:
achilles = player.getSkillLevel(SkillFactory.getSkill(1120004));
achilles1 = SkillFactory.getSkill(1120004);
break;
case 122:
achilles = player.getSkillLevel(SkillFactory.getSkill(1220005));
achilles1 = SkillFactory.getSkill(1220005);
break;
case 132:
achilles = player.getSkillLevel(SkillFactory.getSkill(1320005));
achilles1 = SkillFactory.getSkill(1320005);
break;
}
if (achilles != 0) {
int x = achilles1.getEffect(achilles).getX();
double multiplier = x / 1000.0;
int newdamage = (int)(multiplier * damage);
damage = newdamage;
}
}
Integer mguard = player.getBuffedValue(MapleBuffStat.MAGIC_GUARD);
Integer mesoguard = player.getBuffedValue(MapleBuffStat.MESOGUARD);
Integer mreflect = player.getBuffedValue(MapleBuffStat.MANA_REFLECTION);
if (mguard != null && mpattack == 0) {
int mploss = (int) (damage * (mguard.doubleValue() / 100.0));
int hploss = damage - mploss;
if (mploss > player.getMp()) {
hploss += mploss - player.getMp();
mploss = player.getMp();
}
player.addMPHP(-hploss, -mploss);
} else if(mesoguard != null) {
damage = (damage % 2 == 0) ? damage / 2 : (damage / 2) + 1;
int mesoloss = (int) (damage * (mesoguard.doubleValue() / 100.0));
if(player.getMeso() < mesoloss) {
player.gainMeso(-player.getMeso(), false);
player.cancelBuffStats(MapleBuffStat.MESOGUARD);
} else {
player.gainMeso(-mesoloss, false);
}
player.addMPHP(-damage, -mpattack);
} else {
player.addMPHP(-damage, -mpattack);
}
}
if (!player.isHidden() && !smokescreen) {
player.getMap().broadcastMessage(player, MaplePacketCreator.damagePlayer(damagefrom, monsteridfrom, player.getId(), damage, fake, direction, is_pgmr, pgmr, is_pg, oid, pos_x, pos_y), false);
player.checkBerserk();
}
}
}
Open MapleCharacter and replace your gainExp function with
Code:
public void gainExp(int gain, boolean show, boolean inChat, boolean white) {
int gainShow = gain;
if(c.getPlayer().getRebirths() > 0) {
int rebirths = c.getPlayer().getRebirths();
int newpercent = 100 - (rebirths * 10 + 5);
gain = gain % newpercent;
}
if (getLevel() < 200) { // lvl 200 is max and has 0 exp required to level
if ((long) this.exp.get() + (long) gain > (long) Integer.MAX_VALUE) {
int gainFirst = ExpTable.getExpNeededForLevel(level + 1) - this.exp.get();
gain -= gainFirst + 1;
this.gainExp(gainFirst + 1, false, inChat, white);
}
int newexp = this.exp.addAndGet(gain);
updateSingleStat(MapleStat.EXP, newexp);
} else {
this.exp.set(0);
updateSingleStat(MapleStat.EXP, 0);
}
if (show && gain != 0) { // still show the exp gain even if it's not there
client.getSession().write(MaplePacketCreator.getShowExpGain(gainShow, inChat, white));
}
while (level < 200 && exp.get() >= ExpTable.getExpNeededForLevel(level + 1)) {
levelUp();
}
}
Tell me if there is errors I couldn't test this since I don't use rebirths.
Quote of my post on Valhalla. Enjoy.
/Spoonfeed
EDIT:
After 5-6 rebirths it should start being un-balanced. I suggest you read over the code and adjust it yourself.
Re: [Release] Progressive Rebirths
Hmmm I had something like this in SineMS.
Less exp per levelup, but damage goes up
-edit-
you'res is take damage
Re: [Release] Progressive Rebirths
Quote:
Originally Posted by
Moogra
Hmmm I had something like this in SineMS.
Less exp per levelup, but damage goes up
-edit-
you'res is take damage
Lol. I did it for someone on Valhalla not for these idiots. D:
I'm going to completely balance it even though I don't use rebirths.
EDIT:
This is the first of my onslaught of releases.
Re: [Release] Progressive Rebirths
why do you use c.getPlayer() in the class MapleCharacter?
and if you do use it, you have to add this
Code:
private MapleClient c;
but you dont need to.. P;
and instead of replace all the file, just add this :
Code:
if(player.getRebirths > 0) {
int rebirths = player.getRebirths();
//Try some balancing
// 1 Rebirth = 20% more damage
// 2 Rebirths = 35% more damage
// 3 Rebirths = 50% more damage
int newpercent = (int)((rebirths * 15) + 5) + 100; // + 100 to make it a percent to just multiply
damage = damage % newpercent;
}
above :
Code:
Integer achilles = 0;
and nice release..
Re: [Release] Progressive Rebirths
Nice for low rates server :D
Re: [Release] Progressive Rebirths
Low rate servers wont' get rebirths
Re: [Release] Progressive Rebirths
Quote:
Originally Posted by
TookTook123
why do you use c.getPlayer() in the class MapleCharacter?
and if you do use it, you have to add this
Code:
private MapleClient c;
but you dont need to.. P;
and instead of replace all the file, just add this :
Code:
if(player.getRebirths > 0) {
int rebirths = player.getRebirths();
//Try some balancing
// 1 Rebirth = 20% more damage
// 2 Rebirths = 35% more damage
// 3 Rebirths = 50% more damage
int newpercent = (int)((rebirths * 15) + 5) + 100; // + 100 to make it a percent to just multiply
damage = damage % newpercent;
}
above :
Code:
Integer achilles = 0;
and nice release..
Wow. I just got corrected by a random. D:
I guess you could do that.
Replacing files entirely is easier for noobs.
Re: [Release] Progressive Rebirths
Re: [Release] Progressive Rebirths
Quote:
Originally Posted by
Anujan
Fail jay fail :3 :)
It was for a request on Valhalla! D: