Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

[Release] [v83] Evans

Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139
Since I'm no longer working on v83 and haven't released anything in a while, I thought I'd release Evans for v83 because it was brought up recently.

Just a few heads ups I guess before I get started:
1) This will require lots of editing/implementation. I will assume you know what you're doing.
2) This will also require client editing. I will assume you at least have basic hex-editing knowledge.
3) This will require not only client edits but a lot of WZ Edits too.
4) These Evan classes were not FULLY implemented. You may want to disable these skills entirely!

First we'll start with the server-sided portions. I can't guarantee that line-by-line pasting will work for all OdinMS sources. Like I said, I assume you know what you're doing.

- Server Portion

Update your MapleJob enum:
PHP:
EvanJr(2001),
Evan(2200),
Evan2(2210),
Evan3(2211),
Evan4(2212),
Evan5(2213),
Evan6(2214),
Evan7(2215),
Evan8(2216),
Evan9(2217),
Evan10(2218);

If you have a GameConstants file or a Job check file, add this:
PHP:
public static boolean is_evan_job(int nJob) {
        return nJob / 100 == 22 || nJob == 2001;
    }

In your constants/job folder, make a new file called EvanJr. Place this in it:
PHP:
package constants.skills;
   /**
     * Evan Jr
     */
    public class EvanJr {
        public static final int BlessOfNymph = 20010012;
        public static final int ThrowSnail = 20011000;
        public static final int Regeneration = 20011001;
        public static final int MovingWithActivity = 20011002;
        public static final int SoulOfCraftman = 20011003;
        public static final int MonsterRiding = 20011004;
        public static final int MaxLevel_EchoBuff = 20011005;
        public static final int DamageMeter = 20011006;
        public static final int Maker = 20011007;
        public static final int Bamboo = 20011009;
        public static final int Invincible = 20011010;
        public static final int Berserk = 20011011;
        
        public static final int Massacre = 20011020;
        public static final int MultiPet = 20011024;
        public static final int FlyingSkill = 20011026;
        
        public static final int Disable_YetiEventRiding2 = 20011018;
        public static final int Disable_BroomEventRiding = 20011019;
        
        public static final int WoodenhorseEventRiding = 20011025;
        public static final int KrokoEventRiding = 20011027;
        public static final int NakedEventRiding = 20011028;
        public static final int PinkScooterEventRiding = 20011029;
        public static final int FlyingCloudEventRiding = 20011030;
        public static final int BalrogEventRiding = 20011031;
        public static final int KartEventRiding = 20011033;
        public static final int ZDTigerEventRiding = 20011034;
        public static final int MistBalrogEventRiding = 20011035;
        public static final int LionsEventRiding = 20011036;
        public static final int UnicornEventRiding = 20011037;
        public static final int LowriderEventRiding = 20011038;
        public static final int RedTruckEventRiding = 20011039;
        public static final int GargoylesEventRiding = 20011040;
        public static final int HollyBirdEventRiding = 20011042;
        public static final int OrangeMushroomEventRiding = 20011044;
        public static final int SpaceEventRiding = 20011046;
        public static final int SpaceEventRiding_Dash = 20011047;
        public static final int SpaceEventRiding_Reactor = 20011048;
        public static final int NightmareEventRiding = 20011049;
        public static final int YetiEventRiding = 20011050;
        public static final int OstrichEventRiding = 20011051;
        public static final int BearBaloonEventRiding = 20011052;
        public static final int TransRobotEventRiding = 20011053;
        public static final int ChickenEventRiding = 20011054;
        public static final int MotorbikeEventRiding = 20011063;
        public static final int PoweredSuitEventRiding = 20011064;
        
        public static final int Visitor_EventRiding = 20011065;
        public static final int Visitor_MorphSkill_Normal = 20011066;
        public static final int Visitor_MorphSkill_Skill = 20011067;
        public static final int Visitor_OwlRiding = 20011069;
        public static final int Visitor_MothershipRiding = 20011070;
        public static final int Visitor_OSS3ARiding = 20011071;
        
        public static final int Haste = 20018000;
        public static final int MysticDoor = 20018001;
        public static final int SharpEyes = 20018002;
        public static final int HyperBody = 20018003;
    }

Make another new file, name it Evan. Place this in it:
PHP:
package constants.skills;
    /**
     * Evan
     */
    public class Evan {
        public static final int DragonSoul = 22000000;
        public static final int MagicMissile = 22001001;
        public static final int FireCircle = 22101000;
        public static final int Teleport = 22101001;
        public static final int LightingBolt = 22111000;
        public static final int MagicGuard = 22111001;
        public static final int IceBreath = 22121000;
        public static final int ElementalReset = 22121001;
        public static final int MagicFlair = 22131000;
        public static final int MagicShield = 22131001;
        public static final int MagicCritical = 22140000;
        public static final int DragonThrust = 22141001;
        public static final int MagicBooster = 22141002;
        public static final int Slow = 22141003;
        public static final int ElementAmplification = 22150000;
        public static final int Breath = 22151001;
        public static final int KillingWing = 22151002;
        public static final int MagicRegistance = 22151003;
        public static final int DragonFury = 22160000;
        public static final int Earthquake = 22161001;
        public static final int GhostLettering = 22161002;
        public static final int RecoveryAura = 22161003;
        public static final int MagicMastery = 22170001;
        public static final int MapleHero = 22171000;
        public static final int Illusion = 22171002;
        public static final int FlameWheel = 22171003;
        public static final int HerosWill = 22171004;
        public static final int OnixBlessing = 22181000;
        public static final int Blaze = 22181001;
        public static final int DarkFog = 22181002;
        public static final int SoulStone = 22181003;
    }

Go to SkillFactory and find a big switch statement. In the top portion where isBuff = false, add these to the switch:
PHP:
case Evan.RecoveryAura:
case Evan.IceBreath:
case Evan.Breath:

In the bottom portion where isBuff = true, add these to the switch:
PHP:
case EvanJr.BlessOfNymph:
case EvanJr.Regeneration:
case EvanJr.MovingWithActivity:
case EvanJr.MaxLevel_EchoBuff:
case EvanJr.MonsterRiding:
case EvanJr.FlyingSkill:
case Evan.MagicGuard:
case Evan.ElementalReset:
case Evan.MagicShield:
case Evan.MagicBooster:
case Evan.GhostLettering:
case Evan.MagicRegistance:
case Evan.MapleHero:
case Evan.HerosWill:
case Evan.OnixBlessing:
case Evan.SoulStone:

In sendops.properties, add:
PHP:
DRAGON_ENTER_FIELD = 0xB5
DRAGON_MOVE = 0xB6
DRAGON_LEAVE_FIELD = 0xB7

In recvops.properties, add:
PHP:
# Don't care rn, happens when you click Dragon..
REQUEST_SESSION_VALUE = 0xA5
DRAGON_MOVE = 0xB5

In SendPacketOpcode.java, add to the enum:
PHP:
DRAGON_ENTER_FIELD,
DRAGON_MOVE,
DRAGON_LEAVE_FIELD,

In RecvPacketOpcode.java, add to the enum:
PHP:
REQUEST_SESSION_VALUE,
DRAGON_MOVE

In MaplePacketCreator.java, add:
PHP:
public static byte[] OnDragonEnterField(Dragon pDragon) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(SendPacketOpcode.DRAGON_ENTER_FIELD.getValue());
        mplew.writeInt(pDragon.getOwner().getId());
        mplew.writeInt(pDragon.getPosition().x);
        mplew.writeInt(pDragon.getPosition().y);
        mplew.write(pDragon.getStance());
        mplew.writeShort(/*pDragon.m_nFootholdSN*/0);//Foothold isn't in Odin, is it?
        return mplew.getPacket();
    }
	
public static byte[] OnDragonLeaveField(Dragon pDragon) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(SendPacketOpcode.DRAGON_LEAVE_FIELD.getValue());
        mplew.writeInt(pDragon.getOwner().getId());
        return mplew.getPacket();
    }
	
public static byte[] OnDragonMove(int cid, List<LifeMovementFragment> moves) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(SendPacketOpcode.DRAGON_MOVE.getValue());
        mplew.writeInt(cid);
	mplew.writeInt(0);//StartPos.x, StartPos.y
        serializeMovementList(mplew, moves);
        return mplew.getPacket();
    }

Next, find:
PHP:
public static byte[] updatePlayerStats(List<Pair<MapleStat, Integer>> stats, boolean itemReaction) {

Change it to:
PHP:
public static byte[] updatePlayerStats(List<Pair<MapleStat, Integer>> stats, boolean itemReaction, MapleCharacter chr) {

Below, find:
PHP:
} else if (statupdate.getLeft().getValue() < 0xFFFF) {

Above it, add:
PHP:
} else if (statupdate.getLeft().getValue() == MapleStat.AVAILABLESP.getValue()) {
	if (GameConstants.is_evan_job(chr.getJob().getId())) {
						chr.getExtendedSP().Encode(mplew);
					} else {
						mplew.writeShort(statupdate.getRight().shortValue());
					}

Find addInventoryInfo. You'll see this:
PHP:
mplew.writeShort(0); // start of equip inventory
        for (Item item : chr.getInventory(MapleInventoryType.EQUIP).list()) {
            addItemInfo(mplew, item);
        }
        [b]mplew.writeInt(0);[/b]

Replace the int with this:
PHP:
mplew.writeShort(0);
for (Item item : chr.getInventory(MapleInventoryType.EQUIP).list()) {
	if (item.getPosition() <= -1000 && item.getPosition() > -1100) {
		addItemInfo(mplew, item);
	}
}
mplew.writeShort(0);

Now look for addCharStats. Find this line:
PHP:
mplew.writeShort(chr.getRemainingSp()); // remaining sp

Change it to:
PHP:
if (GameConstants.is_evan_job(chr.getJob().getId()) {
	chr.getExtendedSP().Encode(mplew);
} else {
	mplew.writeShort(chr.getRemainingSp()); // remaining sp
}

In whatever package you like (I prefer client), make a new class called Dragon. Put this in it:
PHP:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package client;

import tools.MaplePacketCreator;

public class Dragon extends AnimatedMapleMapObject {

    private int owner;

    public Dragon(MapleCharacter owner) {
        super();
        this.owner = owner.getId();
        if (!GameConstants.is_evan_job(owner.getJob().getId())) {
            throw new RuntimeException("Trying to create a dragon for a non-Evan");
        }
        setPosition(owner.getTruePosition());
    }

    @Override
    public void sendSpawnData(MapleClient client) {
        client.getSession().write(MaplePacketCreator.OnDragonEnterField(this));
    }

    @Override
    public void sendDestroyData(MapleClient client) {
        client.getSession().write(MaplePacketCreator.OnDragonLeaveField(this));
    }

    public int getOwner() {
        return owner;
    }

    @Override
    public MapleMapObjectType getType() {
        return MapleMapObjectType.SUMMON;
    }
}

In MapleCharacter, add with your other variables:
PHP:
private Dragon dragon;
private ExtendSP extendSP;

At the end of changeJob, add:
PHP:
if (dragon != null) {
                    map.broadcastMessage(MaplePacketCreator.OnDragonLeaveField(dragon));
                    dragon = null;
                }
                if (newJob >= 2200 && newJob <= 2218) {
                    if (getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null) {
                        cancelBuffStats(MapleBuffStat.MONSTER_RIDING);
                    }
                    makeDragon();
                }

Add:
PHP:
public void makeDragon() {
        dragon = new Dragon(this);
        map.broadcastMessage(MaplePacketCreator.OnDragonEnterField(dragon));
    }

    public Dragon getDragon() {
        return dragon;
    }

   public void setDragon(Dragon d) {
        this.dragon = d;
    }

In loadCharToDB, find:
PHP:
ret.remainingSp = rs.getInt("sp");

Change to:
PHP:
final String[] sp = rs.getString("sp").split(",");
if (GameConstants.is_evan_job(ret.job)) {
	int nJobLevel = 0;
	if (ret.job >= 2200)
		nJobLevel++;
	if (ret.job >= 2210)
		nJobLevel++;
	nJobLevel += (ret.job % 10);
	int[] aSP = new int[sp.length];
	for (int i = 0; i < sp.length; i++) {
		aSP[i] = Integer.parseInt(sp[i]);
	}
	ret.extendSP = new ExtendSP(nJobLevel, aSP);
} else {
	ret.remainingSp = Integer.valueOf(sp[0]);
}

Additionally, add:
PHP:
public ExtendSP getExtendedSP() {
	return this.extendSP;
}

Go to saveToDB and find:
PHP:
ps.setInt(13, remainingSp);

Change to:
PHP:
if (GameConstants.is_evan_job(getJob().getId())) {
	String spVals = "";
	for (SPSet spSet : extendSP.lSPSet) {
		spVals += spSet.nSP + ",";
	}
	ps.setString(13, spVals);
} else {
	ps.setString(13, String.valueOf(remainingSp));
}

In sendSpawnData, add:
PHP:
if (dragon != null) {
                client.getSession().write(MaplePacketCreator.OnDragonEnterField(dragon));
            }

In package client again, add:
PHP:
/*
 *     This file is part of Development, a MapleStory Emulator Project.
 *     Copyright (C) 2015 Eric Smith <muffinman75013@yahoo.com>
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     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 General Public License for more details.
 *
 *     You should have received a copy of the GNU General Public License
 */
package client;

import java.util.ArrayList;
import java.util.List;
import tools.data.output.MaplePacketLittleEndianWriter;

/**
 * ExtendSP
 * 
 * @author Eric
 */
public class ExtendSP {
    public final List<SPSet> lSPSet = new ArrayList<>();
    public int m_nTotalSP;
    
    public ExtendSP() {
        SPSet pSPSet;
        for (int i = 1; i <= 10; i++) {
            pSPSet = new SPSet();
            pSPSet.nJobLevel = i;
            pSPSet.nSP = 0;
        }
    }
    
    public ExtendSP(int nJobLevel, int[] anSP) {
        SPSet pSPSet;
        for (int i = 1; i <= nJobLevel; i++) {
            pSPSet = new SPSet();
            pSPSet.nJobLevel = i;
            pSPSet.nSP = anSP[i - 1];
        }
    }
    
    public void Encode(MaplePacketLittleEndianWriter mplew) {
        mplew.write(lSPSet.size());
        for (SPSet pSPSet : lSPSet) {
            mplew.write(pSPSet.nJobLevel);
            mplew.write(pSPSet.nSP);
        }
    }
    
    private class SPSet {
        public int nJobLevel;
        public int nSP;
    }
}

In MapleMap, at the end of addPlayer, add:
PHP:
if (GameConstants.is_evan_job(chr.getJob().getId()) && chr.getJob().getId() >= 2200) {
            if (chr.getDragon() == null) {
                chr.makeDragon();
            } else {
                chr.getDragon().setPosition(chr.getPosition());
            }
            if (chr.getDragon() != null) {
                broadcastMessage(MaplePacketCreator.OnDragonEnterField(chr.getDragon()));
            }
        }

In your Channel Handlers folder, create a new file and name it MoveDragonHandler. Put this in it:
PHP:
/*
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 as
published by the Free Software Foundation 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.server.channel.handlers;

import client.MapleCharacter;
import client.MapleClient;
import java.awt.Point;
import java.util.List;
import client.Dragon;
import server.movement.LifeMovementFragment;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;


public class MoveDragonHandler extends AbstractMovementPacketHandler {

    @Override
    public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
        final MapleCharacter chr = c.getPlayer();
        final Point startPos = new Point(slea.readShort(), slea.readShort());
        List<LifeMovementFragment> res = parseMovement(slea);
        Dragon dragon = chr.getDragon();
        if (dragon != null && res != null && res.size() > 0) {
            updatePosition(res, dragon, 0);
            if (chr.isHidden()) {
                chr.getMap().broadcastGMMessage(chr, MaplePacketCreator.OnDragonMove(chr.getId(), res));
            } else {
                chr.getMap().broadcastMessage(chr, MaplePacketCreator.OnDragonMove(chr.getId(), res), dragon.getPosition());
            }
        }
    }
}

Go to PacketProcessor, and add this under the Channel Handlers portion:
PHP:
registerHandler(RecvPacketOpcode.DRAGON_MOVE, new MoveDragonHandler());

Go to AbstractDealDamageHandler and find parseDamage. Locate this line:
PHP:
if (ret.skill == FPArchMage.BIG_BANG || ret.skill == ILArchMage.BIG_BANG || ret.skill == Bishop.BIG_BANG || ret.skill == Gunslinger.GRENADE || ret.skill == Brawler.CORKSCREW_BLOW || ret.skill == ThunderBreaker.CORKSCREW_BLOW || ret.skill == NightWalker.POISON_BOMB) {

Change to:
PHP:
if (ret.skill == FPArchMage.BIG_BANG || ret.skill == ILArchMage.BIG_BANG || ret.skill == Bishop.BIG_BANG || ret.skill == Gunslinger.GRENADE || ret.skill == Brawler.CORKSCREW_BLOW || ret.skill == ThunderBreaker.CORKSCREW_BLOW || ret.skill == NightWalker.POISON_BOMB || ret.skill == Evan.IceBreath || ret.skill == Evan.Breath) {

Go to CancelBuffHandler and add these to the list:
PHP:
case Evan.IceBreath:
            case Evan.Breath:

Go to MapleBuffStat.java and add these:
PHP:
EvanSlow(0x4000),
MagicShield(0x8000),
MagicResistance(0x10000),
SoulStone(0x20000),

Go to MapleStatEffect and under the big switch handle all these:
Add to Recovery:
PHP:
case Evan.Regeneration:

Add to Echo of hero:
PHP:
case Evan.MaxLevel_EchoBuff:

Add to Magic Guard:
PHP:
case Evan.MagicGuard:

Add to Elemental Reset:
PHP:
 case Evan.ElementalReset:

Add to boosters:
PHP:
case Evan.MagicBooster:

Add to Maple Warriors:
PHP:
case Evan.MapleHero:

Add under Blizzard/Freezes:
PHP:
case Evan.IceBreath:

Add the rest:
PHP:
case Evan.MagicShield:
	statups.add(new Pair<>(MapleBuffStat.MagicShield, Integer.valueOf(x)));
	break;
case Evan.MagicRegistance:
	statups.add(new Pair<>(MapleBuffStat.MagicResistance, Integer.valueOf(x)));
	break;
case Evan.Slow:
	statups.add(new Pair<>(MapleBuffStat.EvanSlow, Integer.valueOf(x)));
	break;
case Evan.SoulStone:
	statups.add(new Pair<>(MapleBuffStat.SoulStone, Integer.valueOf(x)));
	break;

Think there were a few mobstats, you can figure these out/copy Lithium, don't think they handled them correctly though..

- WZ Portion

Now that you have the general handlers, packets, and basic functionality of Evans (minus a few things I hope you'll fix/add yourself!), now you have to WZ Edit the visuals in so you can see everything :)

I have made it easier and decided to upload the required XMLs for everything below.
Download:

First, let's start with Skills. In your repacker, load Skill.wz in the GMS Encryption format. In the downloaded folder, go to the Skill folder and import the Skill XMLs 2001, and 2200~2218 through XML->Import.

Next, click on the 'Skill.wz' node at the very top and add a new Property. (Property->Add Property, or Add->Add New Property). Select 'WzDirectory' and name the directory 'Dragon'. Click OK. Now go below and select the new WzDirectory 'Dragon' node. XML-Import the Dragons from the Dragon folder within Skill. Save!

Next up is the SkillEx window. Warning: Because I had no v84 SkillEx sitting around at this current time, I've just dumped my current SkillEx window. Because of this, I must warn you that this "UIWindow" is a BigBang UI. You can copy the SkillEx window, while it will be big bang, or you can go ahead and get a v84 UI.wz and copy it from there. Note: You will additionally need SkillMacroEx for Evan Skill Macros if you do this yourself! Afterwards, Save!

Now you're going to need Strings! Load String.wz into your repacker. Expand it, and highlight the Eqp.img and Skill.img nodes. Remove their properties (CTRL + R in WzRepacker, DEL in HaRepacker). Now, Highlight String.wz node at the top and XML->Import the two XMLs in the String folder you downloaded. Save!

You're almost done! Last one! Open Character.wz. Create a new WzDirectory like you did for Dragon in Skill.wz, and name it Dragon again. This time XML import the Dragons from the Character folder in the downloaded file. Next, remove the nodes 00002000~00002014 (or w/e the last 20xx node is before 12xx). Then, XML import the new ones from the Character folder. Save!

Additionally you can add Evan Quests and other stuff in your WZ's, which hint hint: will be required in order to handle the Dragon evolving quest stages. This will also visually load the Dragon's stage in your Skill window.

Once all XMLs have been imported, you will need to export the Skill XMLs you just imported as "Private Server" format and move them to your wz/Skill.wz directory on your source. Same goes for the 'Dragon' folder in Skill.wz, and the 'Dragon' folder in Character.wz. You can just export all the new XMLs you just imported if you want to.

- Client Portion

The client portion! In the client's internals, Nexon gets a skill through CSkillInfo::GetSkill. In the v83 client, this sub has internal checks for Evan classes. Basically it's an if-statement checking if jobID != Evan, load skill; otherwise, do nothing. We are going to NOP and disable this if-statement there so we just get the skill anyway.

Open your v83 Localhost with a Hex Editor (since this is easier ;)) like HxD or Hex Editor Neo. Use the key shortcut CTRL + F. Change the search value to "Hex Values" and find the following bytes:

PHP:
83 F8 16 0F 84 D7 00 00 00 81 FE D1 07 00 00 0F 84 CB 00 00 00

Optionally, you could go to the address 00361710 (or if you want the virtual address: 00761707) to find it.

Change it to:
PHP:
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90

File->Save as, your new file.exe.

Also, Client stringpools are set to "Evan, Evan0~Evan10". If GMS doesn't do this, you can use STEDIT to search for the value 'Evan' and change them to their GMS String value.

- Finalization
So now you should have Evans. I don't think I've forgotten or left anything out anyway.. You have your general packets and handlers implemented, map objects and spawning/destroying of the dragons, your skills basically handled along with buffs, the new evan buffstats, the wz's to see everything, and the client fix.

Sadly Evan's are pretty unusable in v83.. They're missing a lot of actions/skills.. but if you just want to see the real Evan Dragon's or be the class and use basic buffs/skills, this would be for you. You'll have to release your client/wz's to everyone obviously.

I forgot to mention, for SP you'll need to modify your database's SP column type in the `characters` table. Just copy Lithium's, it's the same thing. I'll leave that to you. Another thing is in levelUp() you'll have to handle EvanSP and their HP increases. I think the HP/MP vals are assigned the same as regular magicians in Lithium but I forgot, just look at Lithium's (or any other v90+ source) levelUp and reference that for anything you need as they will obviously have Evan's implemented.

I do hope you'll improve some handling on the release as I just referenced an old Odin source and tried translating mine back to it with least work involved, it's not at all anything too great code-wise but it works.

Other than that, have fun! :)

EDIT: I don't have many saved screenshots of it so this is the best I can do for showoff~
dtGaR84 - [Release] [v83] Evans - RaGEZONE Forums

6x8KCyl - [Release] [v83] Evans - RaGEZONE Forums

qOLjpWb - [Release] [v83] Evans - RaGEZONE Forums


- Eric
 

Attachments

You must be registered for see attachments list
Last edited:
(O_o(o_O(O_O)o_O)O_o)
Loyal Member
Joined
Apr 9, 2009
Messages
1,088
Reaction score
322
Lol, you made this too easy xD

So I guess people just have to edit that one lil hex now, download the wz, patch poop up, and use the solaxia source since it has it implemented.. [Correction by Eric: Solaxia is probably missing some parts]

Noice release! --> time to catch up moople :junglejane:

On a more serious note, nice job man. I know of just a few (2-4?) people who could even figure out how to do this. Def some higher level poop. Thank god you are one of them so that it gets released :thumbup1:
 
Junior Spellweaver
Joined
Apr 5, 2008
Messages
152
Reaction score
65
So I guess people just have to edit that one lil hex now, download the wz, patch poop up, and use the solaxia source since it has it implemented.. [Correction by Eric: Solaxia is probably missing some parts]

I know we hadn't gotten to the buffstats in Solaxia. We got to the point where you can't fix any more of it and decided to abandon it.

While they do work, all of the animations are wonky because it won't load both Evan and the Dragon skill animations, and some of the skills don't work at all if I recall correctly.
 
Newbie Spellweaver
Joined
Mar 25, 2016
Messages
86
Reaction score
26
Code:
EVAN_SLOW(78),
MAGIC_SHIELD(79),
MAGIC_RESIST(80),
SOUL_STONE(81),
If you use the nexon format.
 
Last edited:
Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139
BuffStats are
Code:
EVAN_SLOW(78),
MAGIC_SHIELD(79),
MAGIC_RESIST(80),
SOUL_STONE(81),
If you use the nexon format.

Oh, thanks for that, I almost forgot! I probably should've said something about that. I converted my Nexon format to Odin's when I did it haha. So they may need "true" or whatever, I'm not all too familiar with Odin's format as I prefer Nexon's and it's been a while :)
 
Newbie Spellweaver
Joined
Jun 12, 2016
Messages
45
Reaction score
2
Omg thank you eric!

This is THE GREATEST RELEASE in 2016 for v83
 
Last edited:
Custom Title Activated
Loyal Member
Joined
Jan 18, 2010
Messages
3,109
Reaction score
1,139
That Uchia class though LMAO I love it, how'd you make that?

Back in the day (of D.ChaosMS) we had a group of spriters who hand-designed items, skills, and etc. It's just a lot of custom wz editing done by Alpha (they're just some skill covers obviously), except instead of copying a GMS skill like we're doing here, we had GFX's design skills like those instead.
 
Newbie Spellweaver
Joined
Jan 21, 2016
Messages
36
Reaction score
1
when I add those code. the evan's skills can not work too

every skills I can Add on Sp,But I can not use it

when I change Map I will get the error code:38
Eric
 
Back
Top