Custom PVP modes

Ooo, shiny!
Decennium
Joined
Feb 23, 2008
Messages
507
Reaction score
361
Ever wanted to do a PVP boys vs. Girls, or even a job vs. job?

Now you can.

If you don't have PVP already, just search and you'll find it.

Look in net.channel.pvp and look for this :

PHP:
public static void doPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
                DamageBalancer(attack);
                getDirection(attack);
                for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
                        if (attackedPlayers.isAlive() && (player.getParty() == null || player.getId() != attackedPlayers.getId())) {
                                monsterBomb(player, attackedPlayers, map, attack);
                        }
                }
        }
Where you see
PHP:
if (attackedPlayers.isAlive() && (player.getParty() == null || player.getParty() != attackedPlayers.getParty())
Just modify that part to obtain the desired type of PVP.

For example, if you wanted to do Boys VS. Girls, all you have to do is use this script :

PHP:
public static void doGenderPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getGender()!= attackedPlayers.getGender())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
Look at this for a few seconds and try to understand it
if (attackedPlayers.isAlive() && (player.getGender()!= attackedPlayers.getGender())) {

There you go

Here's a list of PVPs I've made

Boys VS. Girls
PHP:
public static void doGenderPvP(MapleCharacter player, MapleMap map,  AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers :  player.getMap().getNearestPvpChar(player.getPosition(), maxDis,  maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() &&  (player.getGender()!= attackedPlayers.getGender())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
Party PVP :
PHP:
public static void doPartyPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getPartyId() != attackedPlayers.getPartyId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
Occupation PVP(You may have to change this depending on how you coded your occupations)
PHP:
public static void doOccupationPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getOccupationId() != attackedPlayers.getOccupationId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }

Guild PVP :

PHP:
         public static void doGuildPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getGuildId() != attackedPlayers.getGuildId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
Here's my entire MaplePvP.java for you guys :

PHP:
package net.channel.pvp;


import client.MapleCharacter;
import client.MapleBuffStat;
import client.MapleStat;
import client.MapleJob;
import net.world.guild.MapleGuild;
import net.channel.handler.AbstractDealDamageHandler;
import server.life.MapleMonster;
import server.life.MapleLifeFactory;
import server.maps.MapleMap;
import tools.MaplePacketCreator;

public class MaplePvp {
        private static int pvpDamage;
        private static int maxDis;
        private static int maxHeight;
        private static boolean isAoe = false;
        public static boolean isLeft = false;
        public static boolean isRight = false;

        private static boolean isMeleeAttack(AbstractDealDamageHandler.AttackInfo attack) {
                switch(attack.skill) {
                        case 1001004:    //Power Strike
                        case 1001005:    //Slash Blast
                        case 4001334:    //Double Stab
                        case 4201005:    //Savage Blow
                        case 1111004:    //Panic: Axe
                        case 1111003:    //Panic: Sword
                        case 1311004:    //Dragon Fury: Pole Arm
                        case 1311003:    //Dragon Fury: Spear
                        case 1311002:    //Pole Arm Crusher
                        case 1311005:    //Sacrifice
                        case 1311001:    //Spear Crusher
                        case 1121008:    //Brandish
                        case 1221009:    //Blast
                        case 1121006:    //Rush
                        case 1221007:    //Rush
                        case 1321003:    //Rush
                        case 4221001:    //Assassinate
                        return true;
                }
                return false;
        }

        private static boolean isRangeAttack(AbstractDealDamageHandler.AttackInfo attack) {
                switch(attack.skill) {
                        case 2001004:    //Energy Bolt
                        case 2001005:    //Magic Claw
                        case 3001004:    //Arrow Blow
                        case 3001005:    //Double Shot
                        case 4001344:    //Lucky Seven
                        case 2101004:    //Fire Arrow
                        case 2101005:    //Poison Brace
                        case 2201004:    //Cold Beam
                        case 2301005:    //Holy Arrow
                        case 4101005:    //Drain
                        case 2211002:    //Ice Strike
                        case 2211003:    //Thunder Spear
                        case 3111006:    //Strafe
                        case 3211006:    //Strafe
                        case 4111005:    //Avenger
                        case 4211002:    //Assaulter
                        case 2121003:    //Fire Demon
                        case 2221006:    //Chain Lightning
                        case 2221003:    //Ice Demon
                        case 2111006:     //Element Composition F/P
                        case 2211006:     //Element Composition I/L
                        case 2321007:    //Angel's Ray
                        case 3121003:    //Dragon Pulse
                        case 3121004:    //Hurricane
                        case 3221003:    //Dragon Pulse
                        case 3221001:    //Piercing
                        case 3221007:    //Sniping
                        case 4121003:    //Showdown taunt
                        case 4121007:    //Triple Throw
                        case 4221007:    //Boomerang Step
                        case 4221003:    //Showdown taunt
                        case 4111004:    //Shadow Meso
                        return true;
                }
                return false;
        }

        private static boolean isAoeAttack(AbstractDealDamageHandler.AttackInfo attack) {
                switch(attack.skill) {
                        case 2201005:    //Thunderbolt
                        case 3101005:    //Arrow Bomb : Bow
                        case 3201005:    //Iron Arrow : Crossbow
                        case 1111006:    //Coma: Axe
                        case 1111005:    //Coma: Sword
                        case 1211002:    //Charged Blow
                        case 1311006:    //Dragon Roar
                        case 2111002:    //Explosion
                        case 2111003:    //Poison Mist
                        case 2311004:    //Shining Ray
                        case 3111004:    //Arrow Rain
                        case 3111003:    //Inferno
                        case 3211004:    //Arrow Eruption
                        case 3211003:    //Blizzard (Sniper)
                        case 4211004:    //Band of Thieves
                        case 1221011:    //Sanctuary Skill
                        case 2121001:    //Big Bang
                        case 2121007:    //Meteo
                        case 2121006:    //Paralyze
                        case 2221001:    //Big Bang
                        case 2221007:    //Blizzard
                        case 2321008:    //Genesis
                        case 2321001:    //Big Bang
                        case 4121004:    //Ninja Ambush
                        case 4121008:    //Ninja Storm knockback
                        case 4221004:    //Ninja Ambush
                        return true;
                }
                return false;
        }

        private static void getDirection(AbstractDealDamageHandler.AttackInfo attack) {
                if (isAoe) {
                        isRight = true;
                        isLeft = true;
                } else if (attack.direction <= 0 && attack.stance <= 0) {
                        isRight = false;
                        isLeft = true;
                } else {
                        isRight = true;
                        isLeft = false;
                }
        }

        private static void DamageBalancer(AbstractDealDamageHandler.AttackInfo attack) {
                if (attack.skill == 0) {
                        pvpDamage = 100;
                        maxDis = 130;
                        maxHeight = 35;
                } else if (isMeleeAttack(attack)) {
                        maxDis = 130;
                        maxHeight = 45;
                        isAoe = false;
                        if (attack.skill == 4201005) {
                                pvpDamage = (int) (Math.floor(Math.random() * (75 - 5) + 5));
                        } else if (attack.skill == 1121008) {
                                pvpDamage = (int) (Math.floor(Math.random() * (320 - 180) + 180));
                                maxHeight = 50;
                        } else if (attack.skill == 4221001) {
                                pvpDamage = (int) (Math.floor(Math.random() * (200 - 150) + 150));
                        } else if (attack.skill == 1121006 || attack.skill == 1221007 || attack.skill == 1321003) {
                                pvpDamage = (int) (Math.floor(Math.random() * (200 - 80) + 80));
                        } else {
                                pvpDamage = (int) (Math.floor(Math.random() * (600 - 250) + 250));
                        }
                } else if (isRangeAttack(attack)) {
                        maxDis = 300;
                        maxHeight = 40;
                        isAoe = false;
                        if (attack.skill == 4201005) {
                                pvpDamage = (int) (Math.floor(Math.random() * (75 - 5) + 5));
                        } else if (attack.skill == 4121007) {
                                pvpDamage = (int) (Math.floor(Math.random() * (60 - 15) + 15));
                        } else if (attack.skill == 4001344 || attack.skill == 2001005) {
                                pvpDamage = (int) (Math.floor(Math.random() * (195 - 90) + 90));
                        } else if (attack.skill == 4221007) {
                                pvpDamage = (int) (Math.floor(Math.random() * (350 - 180) + 180));
                        } else if (attack.skill == 3121004 || attack.skill == 3111006 || attack.skill == 3211006) {
                                maxDis = 450;
                                pvpDamage = (int) (Math.floor(Math.random() * (50 - 20) + 20));
                        } else if (attack.skill == 2121003 || attack.skill == 2221003) {
                                pvpDamage = (int) (Math.floor(Math.random() * (600 - 300) + 300));
                        } else {
                                pvpDamage = (int) (Math.floor(Math.random() * (400 - 250) + 250));
                        }
                } else if (isAoeAttack(attack)) {
                        maxDis = 350;
                        maxHeight = 350;
                        isAoe = true;
                        if (attack.skill == 2121001 || attack.skill == 2221001 || attack.skill == 2321001 || attack.skill == 2121006) {
                                maxDis = 175;
                                maxHeight = 175;
                                pvpDamage = (int) (Math.floor(Math.random() * (350 - 180) + 180));
                        } else {
                                pvpDamage = (int) (Math.floor(Math.random() * (700 - 300) + 300));
                        }
                }
        }

        private static void monsterBomb(MapleCharacter player, MapleCharacter attackedPlayers, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
                //level balances
                if (attackedPlayers.getLevel() > player.getLevel() + 25) {
                        pvpDamage *= 1.35;
                } else if (attackedPlayers.getLevel() < player.getLevel() - 25) {
                        pvpDamage /= 1.35;
                } else if (attackedPlayers.getLevel() > player.getLevel() + 100) {
                        pvpDamage *= 1.50;
                } else if (attackedPlayers.getLevel() < player.getLevel() - 100) {
                        pvpDamage /= 1.50;
                }
                //class balances
                if (player.getJob().equals(MapleJob.MAGICIAN)) {
                        pvpDamage *= 1.20;
                }

                //buff modifiers
        Integer mguard = attackedPlayers.getBuffedValue(MapleBuffStat.MAGIC_GUARD);
        Integer mesoguard = attackedPlayers.getBuffedValue(MapleBuffStat.MESOGUARD);
        if (mguard != null) {
            int mploss = (int) (pvpDamage / .5);
                        pvpDamage *= .70;
            if (mploss > attackedPlayers.getMp()) {
                                pvpDamage /= .70;
                attackedPlayers.cancelBuffStats(MapleBuffStat.MAGIC_GUARD);
            } else {
                                attackedPlayers.setMp(attackedPlayers.getMp() - mploss);
                                attackedPlayers.updateSingleStat(MapleStat.MP, attackedPlayers.getMp());
                        }
        } else if (mesoguard != null) {
            int mesoloss = (int) (pvpDamage * .80);
                        pvpDamage *= .80;
            if(mesoloss > attackedPlayers.getMeso()) {
                                        pvpDamage /= .80;
                    attackedPlayers.cancelBuffStats(MapleBuffStat.MESOGUARD);
            } else {
                    attackedPlayers.gainMeso(-mesoloss, false);
            }
                }

                //set up us teh bonmb
                //training thingy = 9409000
                MapleMonster pvpMob = MapleLifeFactory.getMonster(9400711);
                map.spawnMonsterOnGroundBelow(pvpMob, attackedPlayers.getPosition());
                for (int attacks = 0; attacks < attack.numDamage; attacks++) {
                        map.broadcastMessage(MaplePacketCreator.damagePlayer(attack.numDamage, pvpMob.getId(), attackedPlayers.getId(), pvpDamage, attacks, attacks, isAoe, maxDis, isAoe, maxDis, maxDis, maxDis));
                        attackedPlayers.addHP(-pvpDamage);
                }
                int attackedDamage = pvpDamage * attack.numDamage;
                attackedPlayers.getClient().getSession().write(MaplePacketCreator.serverNotice(5, player.getName() + " has hit you for " + attackedDamage + " damage!"));
                map.killMonster(pvpMob, player, false);

                //rewards
                if (attackedPlayers.getHp() <= 0 && !attackedPlayers.isAlive()) {
                        int expReward = attackedPlayers.getLevel() * 100;
                        int gpReward = (int) (Math.floor(Math.random() * (200 - 50) + 50));
                        if (player.getPvpKills() * .25 >= player.getPvpDeaths()) {
                                expReward *= 20;
                        }
                        player.gainExp(expReward, true, false);
                        if (player.getGuildId() != 0 && player.getGuildId() != attackedPlayers.getGuildId()) {
                                try {
                                        MapleGuild guild = player.getClient().getChannelServer().getWorldInterface().getGuild(player.getGuildId(), null);
                                        guild.gainGP(gpReward);
                                } catch (Exception e) {}
                        }
                        player.gainPvpKill();
                        player.getClient().getSession().write(MaplePacketCreator.serverNotice(6, "You've killed " + attackedPlayers.getName() + "!! You've gained a pvp kill!"));
                        attackedPlayers.gainPvpDeath();
                        attackedPlayers.getClient().getSession().write(MaplePacketCreator.serverNotice(6, player.getName() + " has killed you!"));
                }
        }

        public static void doPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
                DamageBalancer(attack);
                getDirection(attack);
                for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
                        if (attackedPlayers.isAlive() && (player.getParty() == null || player.getParty() != attackedPlayers.getParty())) {
                                monsterBomb(player, attackedPlayers, map, attack);
                        }
                }
        }
         public static void doGuildPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getGuildId() != attackedPlayers.getGuildId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
         public static void doOccupationPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getOccupationId() != attackedPlayers.getOccupationId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
         public static void doInfectionPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.isInfected() != attackedPlayers.isInfected())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
         public static void doPartyPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getPartyId() != attackedPlayers.getPartyId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
        public static void doGenderPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.getGuildId() != attackedPlayers.getGuildId())) {
                monsterBomb(player, attackedPlayers, map, attack);
            }
        }
    }
        public static void doServerPvP(MapleCharacter player, MapleMap map, AbstractDealDamageHandler.AttackInfo attack) {
        DamageBalancer(attack);
        getDirection(attack);
        for (MapleCharacter attackedPlayers : player.getMap().getNearestPvpChar(player.getPosition(), maxDis, maxHeight, player.getMap().getCharacters())) {
            if (attackedPlayers.isAlive() && (player.isPVPToggled() == true && attackedPlayers.isPVPToggled() == true)) {
                if(attackedPlayers.getMap().isTown() != true){
                monsterBomb(player, attackedPlayers, map, attack);
                }
                else if(attackedPlayers.getMap().isTown() == true){
                    // do nothing
                }
            }
        }
    }
        
}

Credits to me for the modifications, credits to the original coder of PvP.

Instead of posting "Thanks", please just click on the thanks button. Thank you.

I'm selling the complete Occupation Package (EXP Handling + Occupation Leveling + Effects & job changing) for 10$. Send an e-mail at : [email protected]
 
Last edited:
I SWEAR THIS WAS ON KRYPTO DEV BY LXSHUTDOWN. dude either ur the creator/him or some guy that edited his post u even copied the "Credits to me for the modifications, credits to the original coder of PvP." but the last part wasnt his so at least u modified something.
 
I SWEAR THIS WAS ON KRYPTO DEV BY LXSHUTDOWN. dude either ur the creator/him or some guy that edited his post u even copied the "Credits to me for the modifications, credits to the original coder of PvP." but the last part wasnt his so at least u modified something.
I am LxShutdown.


There, I modified the thread on Krypto for you.

LxShutdown said:
Just to clairfy some things,I am FateJiki from RaGeZONE
 
Last edited:
Question does this need these 2 mysql code inserts to work?

ALTER TABLE `characters` ADD COLUMN `pvpkills` int(11) NOT NULL DEFAULT '0' AFTER `messengerposition`;

ALTER TABLE `characters` ADD COLUMN `pvpdeaths` int(11) NOT NULL DEFAULT '0' AFTER `pvpkills`;
 
Question does this need these 2 mysql code inserts to work?

ALTER TABLE `characters` ADD COLUMN `pvpkills` int(11) NOT NULL DEFAULT '0' AFTER `messengerposition`;

ALTER TABLE `characters` ADD COLUMN `pvpdeaths` int(11) NOT NULL DEFAULT '0' AFTER `pvpkills`;
Yes, it requires both columns.
 
I dislike MapleStory pvp in any form but the idea of doing all those different things with it makes me wanna have a chat with you about all the awesome possibilities that could be done in OdinMs, we would be talking for hours.
 
I dislike MapleStory pvp in any form but the idea of doing all those different things with it makes me wanna have a chat with you about all the awesome possibilities that could be done in OdinMs, we would be talking for hours.


We should talk. ;)
 
I've seen this one somewhere also, I think it was from ForgottenStory, or from a prior release. The codes actually look quite similar, except for the alive check.

To my understanding this wouldn't work unless you added the 'doXXXPVP' in ApplyAttack in AbstractDealDamageHandler, which was why it didn't work in forgotten.
 
Last edited:
I've seen this one somewhere also, I think it was from ForgottenStory, or from a prior release. The codes actually look quite similar, except for the alive check.

To my understanding this wouldn't work unless you added the 'doXXXPVP' in ApplyAttack in AbstractDealDamageHandler, which was why it didn't work in forgotten.
It's very similar to the individual who released "Odin-based PVP", however, this is a just something like a tutorial, but with releases .

Basically, I'm just releasing how to do Custom PVP modes, and releasing some already made.
 
Back