• Unfortunately, we have experienced significant hard drive damage that requires urgent maintenance and rebuilding. The forum will be a state of read only until we install our new drives and rebuild all the configurations needed. Please follow our Facebook page for updates, we will be back up shortly! (The forum could go offline at any given time due to the nature of the failed drives whilst awaiting the upgrades.) When you see an Incapsula error, you know we are in the process of migration.

[Add-on] v83 3rd Person Ring Effects

Status
Not open for further replies.
Joined
Nov 27, 2009
Messages
442
Reaction score
230
Ring Effects 3rd Person for v83, as stated in the title. Haven't done anything for the community in a while, so I though why not release the last thing I coded.

PS: To charlie (PirateOwh) y u sell me ring effects? ):
PSS: Umm looking for beta testers for me gms-like server, post/send your contact either through vistior message or PM. kk ty
PSSLOL: i like deh thx, so hit the 'heart i luv u' button pl0x

addItemInfo:
PHP:
private static void addItemInfo(MaplePacketLittleEndianWriter mplew, IItem item, boolean zeroPosition, boolean leaveOut, boolean gachapon, boolean inTrade) {
        boolean ring = false;
        IEquip equip = null;
        if (item.getType() == IItem.EQUIP) {
            equip = (IEquip) item;
            if (equip.getRingId() > -1) {
                ring = true;
            }
        }
        byte pos = item.getPosition();
        boolean masking = false;
        if (!gachapon) {
            if (zeroPosition) {
                if (!leaveOut) {
                        mplew.write(0);
                }
            } else if (pos <= (byte) -1) {
                pos *= -1;
                if (pos > 100 || ring) {
                    masking = true;
                    mplew.writeShort(pos - 100);
                } else {
                    if((item.getType() == IItem.EQUIP) && (!inTrade))
                        mplew.writeShort(pos);
                    else
                        mplew.write(pos);
                }
            } else {
                if((item.getType() == IItem.EQUIP) && (!inTrade))
                    mplew.writeShort(item.getPosition());
                else
                    mplew.write(item.getPosition());
            }
        }
        if (item.getPetId() > -1) {
            mplew.write(3);
        } else {
            mplew.write(item.getType());
        }
        mplew.writeInt(item.getItemId());
        if (ring) {
            mplew.write(1);
            mplew.writeInt(equip.getRingId());
            mplew.writeInt(0);
        }
        if (item.getPetId() > -1) {
            MaplePet pet = MaplePet.loadFromDb(item.getItemId(), item.getPosition(), item.getPetId());
            String petname = pet.getName();
            mplew.write(1);
            mplew.writeInt(item.getPetId());
            mplew.writeInt(0);
            mplew.write(0);
            mplew.write(ITEM_MAGIC);
            mplew.write(HexTool.getByteArrayFromHexString("BB 46 E6 17 02"));
            if (petname.length() > 13) {
                petname = petname.substring(0, 13);
            }
            mplew.writeAsciiString(petname);
            for (int i = petname.length(); i < 13; i++) {
                mplew.write(0);
            }
            mplew.write(pet.getLevel());
            mplew.writeShort(pet.getCloseness());
            mplew.write(pet.getFullness());
            mplew.writeLong(getKoreanTimestamp((long) (System.currentTimeMillis() * 1.2)));
            mplew.writeInt(0);
            mplew.write(HexTool.getByteArrayFromHexString("50 46 00 00 00 00")); //wonder what this is - WAS 50 46 00 00
            return;
        }
        if (masking && !ring) {
            mplew.write(HexTool.getByteArrayFromHexString("01 BE 50 17 00 00 00 00 00 B0 CE EB"));
            addExpirationTime(mplew, 0, false);
        } else if (ring) {
            mplew.writeLong(getKoreanTimestamp((long) (System.currentTimeMillis() * 1.2)));
        } else {
            mplew.writeShort(0);
            mplew.write(ITEM_MAGIC);
            addExpirationTime(mplew, 0, false);
        }
        if (item.getType() == IItem.EQUIP) {
            mplew.write(equip.getUpgradeSlots());
            mplew.write(equip.getLevel());
            mplew.writeShort(equip.getStr()); // str
            mplew.writeShort(equip.getDex()); // dex
            mplew.writeShort(equip.getInt()); // int
            mplew.writeShort(equip.getLuk()); // luk
            mplew.writeShort(equip.getHp()); // hp
            mplew.writeShort(equip.getMp()); // mp
            mplew.writeShort(equip.getWatk()); // watk
            mplew.writeShort(equip.getMatk()); // matk
            mplew.writeShort(equip.getWdef()); // wdef
            mplew.writeShort(equip.getMdef()); // mdef
            mplew.writeShort(equip.getAcc()); // accuracy
            mplew.writeShort(equip.getAvoid()); // avoid
            mplew.writeShort(equip.getHands()); // hands
            mplew.writeShort(equip.getSpeed()); // speed
            mplew.writeShort(equip.getJump()); // jump
            mplew.writeMapleAsciiString(equip.getOwner());
            mplew.writeShort(equip.getFlag()); //Item Flags
            if (!masking || ring) {
                mplew.write(0);
                mplew.write(equip.getItemLevel()); // item level
                mplew.writeShort(0);
                mplew.writeShort(1); // item exp
                mplew.writeShort(equip.getVicious());
                mplew.writeShort(0);
                if (!ring) {
                    mplew.writeLong(0);
                    mplew.write(HexTool.getByteArrayFromHexString("00 40 E0 FD 3B 37 4F 01"));
                } else {
                    mplew.write(HexTool.getByteArrayFromHexString("10 B0 EB A4 14 97 CA 01"));
                }
            } else {
                mplew.write(HexTool.getByteArrayFromHexString("65 0A 28 27 F4 00 00 00 00 00 00 40 E0 FD 3B 37 4F 01"));
            }
            mplew.writeInt(-1);
        } else {
            mplew.writeShort(item.getQuantity());
            mplew.writeMapleAsciiString(item.getOwner());
            mplew.writeShort(item.getFlag());
            if (InventoryConstants.isRechargable(item.getItemId())) {
                mplew.write(HexTool.getByteArrayFromHexString("02 00 00 00 54 00 00 34"));
            }
        }
    }

updateCharLook:
PHP:
public static MaplePacket updateCharLook(MapleCharacter chr) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(0xC5);
        mplew.writeInt(chr.getId());
        mplew.write(1);
        addCharLook(mplew, chr, false);
        if (chr.getMarriageRings().size() + chr.getFriendshipRings().size() + chr.getCrushRings().size() > 0) {
            addAllRingPacketInfo(mplew, chr);
        } else {
            mplew.write0(10);
        }
        mplew.write(0);
        mplew.write(0);
        mplew.write(0);
        return mplew.getPacket();
    }

addAllRingPacketInfo:
PHP:
public static void addAllRingPacketInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {
        MapleInventory iv = chr.getInventory(MapleInventoryType.EQUIPPED);
        Collection<IItem> equippedC = iv.list();
        List<Item> equipped = new ArrayList<Item>(equippedC.size());
        for (IItem item : equippedC)
            equipped.add((Item) item);
        Collections.sort(equipped);
        List<MapleRing> crushRings = new ArrayList<MapleRing>();
        List<MapleRing> friendshipRings = new ArrayList<MapleRing>();
        List<MapleRing> marriageRings = new ArrayList<MapleRing>();
        for (Item item : equipped) {
            if (item.getItemId() >= 1112001 && item.getItemId() <= 1112007 || item.getItemId() == 1112012) {
                if (((IEquip) item).getRingId() > -1)
                    crushRings.add(MapleRing.loadFromDb(((IEquip) item).getRingId()));
            } else if (item.getItemId() >= 1112800 && item.getItemId() <= 1112802) {
                if (((IEquip) item).getRingId() > -1)
                    friendshipRings.add(MapleRing.loadFromDb(((IEquip) item).getRingId()));
            } else if (item.getItemId() >= 1112001 && item.getItemId() <= 1112007 || item.getItemId() == 1112012) {
                if (((IEquip) item).getRingId() > -1)
                    marriageRings.add(MapleRing.loadFromDb(((IEquip) item).getRingId()));
            }
        }
        Collections.sort(crushRings);
        if (crushRings.size() > 0) {
            for (MapleRing mr : crushRings) {
                mplew.write(1);
                mplew.writeInt(mr.getRingId());
                mplew.writeInt(0);
                mplew.writeInt(mr.getPartnerRingId());
                mplew.writeInt(0);
                mplew.writeInt(mr.getItemId());
            }
        }
        Collections.sort(friendshipRings);
        if (friendshipRings.size() > 0) {
            for (MapleRing mr : friendshipRings) {
                mplew.write(1);
                mplew.writeInt(mr.getRingId());
                mplew.writeInt(0);
                mplew.writeInt(mr.getPartnerRingId());
                mplew.writeInt(0);
                mplew.writeInt(mr.getItemId());
                mplew.write(1); // incorrect
            }
        }
        Collections.sort(marriageRings);
        if (marriageRings.size() > 0) {
            for (MapleRing mr : marriageRings) {
                mplew.writeInt(mr.getPartnerChrId());
                mplew.writeInt(chr.getId());
                mplew.writeInt(mr.getItemId());
            }
        } else {
            mplew.write(0);
        }
    }

getCharInfo:
PHP:
Replace mplew.writeLong(0); with addRingInfo(mplew, chr);

addRingInfo:
PHP:
private static void addRingInfo(MaplePacketLittleEndianWriter mplew, MapleCharacter chr) {
        mplew.writeShort(0); // Start of Rings
        mplew.writeShort(chr.getCrushRings().size());
        for (MapleRing ring : chr.getCrushRings()) {
            mplew.writeInt(ring.getPartnerChrId());
            mplew.writeAsciiString(StringUtil.getRightPaddedStr(ring.getPartnerName(), '\0', 13));
            mplew.writeInt(ring.getRingId());
            mplew.writeInt(0);
            mplew.writeInt(ring.getPartnerRingId());
            mplew.writeInt(0);
        }
        mplew.writeShort(chr.getFriendshipRings().size());
        for (MapleRing ring : chr.getFriendshipRings()) {
            mplew.writeInt(ring.getPartnerChrId());
            mplew.writeAsciiString(StringUtil.getRightPaddedStr(ring.getPartnerName(), '\0', 13));
            mplew.writeInt(ring.getRingId());
            mplew.writeInt(0);
            mplew.writeInt(ring.getPartnerRingId());
            mplew.writeInt(0);
            mplew.writeInt(ring.getItemId());
        }
        mplew.writeShort(chr.getMarriageRings().size());
        int marriageId = 30000;
        for (MapleRing ring : chr.getMarriageRings()) {
            mplew.writeInt(marriageId);
            mplew.writeInt(chr.getGender() == 0 ? chr.getId() : ring.getPartnerChrId());
            mplew.writeInt(chr.getGender() == 0 ? ring.getPartnerChrId() : chr.getId());
            mplew.writeShort(3);
            mplew.writeInt(ring.getRingId());
            mplew.writeInt(ring.getPartnerRingId());
            mplew.writeAsciiString(StringUtil.getRightPaddedStr(chr.getGender() == 0 ? chr.getName() : ring.getPartnerName(), '\0', 13));
            mplew.writeAsciiString(StringUtil.getRightPaddedStr(chr.getGender() == 0 ? ring.getPartnerName() : chr.getName(), '\0', 13));
            marriageId++;
        }
    }

spawnPlayerMapObject:
PHP:
public static MaplePacket spawnPlayerMapobject(MapleCharacter chr) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(0xA0);
        mplew.writeInt(chr.getId());
        mplew.write(chr.getLevel());
        mplew.writeMapleAsciiString(chr.getName());
        if (chr.getGuildId() < 1) {
            mplew.writeMapleAsciiString("");
            mplew.write(new byte[6]);
        } else {
            MapleGuildSummary gs = chr.getClient().getChannelServer().getGuildSummary(chr.getGuildId());
            if (gs != null) {
                mplew.writeMapleAsciiString(gs.getName());
                mplew.writeShort(gs.getLogoBG());
                mplew.write(gs.getLogoBGColor());
                mplew.writeShort(gs.getLogo());
                mplew.write(gs.getLogoColor());
            } else {
                mplew.writeMapleAsciiString("");
                mplew.write(new byte[6]);
            }
        }
        mplew.writeInt(0); //Not sure anymore this should be an int.
        mplew.writeShort(0);
        mplew.write(0xfc);
        mplew.write(1);

        //mplew.writeInt(0);
       // mplew.writeShort(0);
        if (chr.getBuffedValue(MapleBuffStat.MORPH) != null) {
            mplew.writeInt(2);
        } else {
            mplew.writeInt(0);
        }
        long buffmask = 0;
        Integer buffvalue = null;
        if (chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null && !chr.isHidden()) {
            buffmask |= MapleBuffStat.DARKSIGHT.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.COMBO) != null) {
            buffmask |= MapleBuffStat.COMBO.getValue();
            buffvalue = Integer.valueOf(chr.getBuffedValue(MapleBuffStat.COMBO).intValue());
        }
        if (chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null) {
            buffmask |= MapleBuffStat.SHADOWPARTNER.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.SOULARROW) != null) {
            buffmask |= MapleBuffStat.SOULARROW.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.MORPH) != null) {
            buffvalue = Integer.valueOf(chr.getBuffedValue(MapleBuffStat.MORPH).intValue());
        }
        mplew.writeInt((int) ((buffmask >> 32) & 0xffffffffL));
        if (buffvalue != null) {
            if (chr.getBuffedValue(MapleBuffStat.MORPH) != null) {
                mplew.writeShort(buffvalue);
            } else {
                mplew.write(buffvalue.byteValue());
            }
        }
        mplew.writeInt((int) (buffmask & 0xffffffffL));
        int CHAR_MAGIC_SPAWN = Randomizer.getInstance().nextInt();
        mplew.writeInt(0);
     //   mplew.writeInt(0);
        mplew.writeShort(0);
        mplew.writeInt(CHAR_MAGIC_SPAWN);
        mplew.writeShort(0); //v74
        mplew.write(0); //v74
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(CHAR_MAGIC_SPAWN);//v74
        mplew.writeShort(0);
        mplew.write(0); //v74
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(CHAR_MAGIC_SPAWN);
        mplew.writeShort(chr.attackedKills);
        mplew.write(0);
        IItem mount = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -18);
        if (chr.getBuffedValue(MapleBuffStat.MONSTER_RIDING) != null && mount != null) {
            mplew.writeInt(mount.getItemId());
            mplew.writeInt(1004);
        } else {
            mplew.writeLong(0);
        }
        mplew.writeInt(CHAR_MAGIC_SPAWN);
        mplew.write(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(CHAR_MAGIC_SPAWN);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(CHAR_MAGIC_SPAWN);
        mplew.write(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(CHAR_MAGIC_SPAWN);
        mplew.writeShort(0);
        mplew.write(0);
        int job = 412;
        Iterator<ISkill> Skills = chr.getSkills().keySet().iterator();
        while (Skills.hasNext()) {
            int ID = Skills.next().getId();
            if (ID == 11101005 || ID == 14101004) {
                job = ID / 10000;
                break;
            }
        }
        mplew.writeShort(job);
        addCharLook(mplew, chr, false);
        mplew.writeInt(0);
        mplew.writeInt(chr.getItemEffect());
        mplew.writeInt(chr.getChair());
        mplew.writeShort(chr.getPosition().x);
        mplew.writeShort(chr.getPosition().y);
        mplew.write(chr.getStance());
        mplew.writeInt(0);
        mplew.writeInt(1);
        mplew.writeLong(0);
        mplew.writeShort(0);
        if (chr.getMarriageRings().size() + chr.getFriendshipRings().size() + chr.getCrushRings().size() > 0) {
            addAllRingPacketInfo(mplew, chr);
        } else {
            mplew.write0(10);
        }
        mplew.write0(5);
        return mplew.getPacket();
    }

There's also somestuff you have to add to saveToDB or ItemFactory.java but i'm too lazy to post :thumbdown:



Picture from KyraMS:
Expedia - [Add-on] v83 3rd Person Ring Effects - RaGEZONE Forums
 
Last edited:
Junior Spellweaver
Joined
May 4, 2010
Messages
153
Reaction score
3
Re: v83 3rd Person Ring Effects

*jizz* Nice i'll Try to use it for My v83 :3 if i ever find the solution to the website connection problem :3
 
Master Summoner
Loyal Member
Joined
Apr 20, 2008
Messages
578
Reaction score
76
Re: v83 3rd Person Ring Effects

Code:
        int marriageId = 30000; 
        for (MapleRing ring : chr.getMarriageRings()) { 
            mplew.writeInt(marriageId); 
            mplew.writeInt(chr.getGender() == 0 ? chr.getId() : ring.getPartnerChrId()); 
            mplew.writeInt(chr.getGender() == 0 ? ring.getPartnerChrId() : chr.getId()); 
            mplew.writeShort(3); 
            mplew.writeInt(ring.getRingId()); 
            mplew.writeInt(ring.getPartnerRingId()); 
            mplew.writeAsciiString(StringUtil.getRightPaddedStr(chr.getGender() == 0 ? chr.getName() : ring.getPartnerName(), '\0', 13)); 
            mplew.writeAsciiString(StringUtil.getRightPaddedStr(chr.getGender() == 0 ? ring.getPartnerName() : chr.getName(), '\0', 13)); 
            marriageId++; 
        }

-This is partly incorrect
-addAllRingPacketInfo as well as its implementation is also not handled in a very good way in terms of packets

-as for its coding, you can always just look in specific slots for rings instead of all equipped items. also, checking for ring size in spawn player and update char look is pointless when you can simply do it in addAllRingPacketInfo instead seeing as it gets all rings in a better way right there and then.
-Though however you are missing a few IDs there in addAllRingPacketInfo such as friendship/crush shirts 1408000 and 1409000, not sure if they are in v83 though but they are handled the same way as rings (though a different slot) as well as many others but I've no idea if they're in v83 or not.
-And your marriage ring IDs in addAllRingPacketInfo are completely off, looks like it was copied off of crush rings

-Thread title is wrong when your screenshot clearly shows first person rings. Third person means everyone except for the ring owners can see it (with some discrepancies between ring owners). should be "v83 Ring Effects" seeing as if you have first person, you technically have third person as well because first person will not work without the third person packets.
 
Last edited:
Newbie Spellweaver
Joined
Apr 13, 2010
Messages
53
Reaction score
19
Re: v83 3rd Person Ring Effects

LMAO hmm this is from mapleblade source :(
try releasing v88 source instead:)
 
Joined
Nov 27, 2009
Messages
442
Reaction score
230
Re: v83 3rd Person Ring Effects

LMAO hmm this is from mapleblade source :(
try releasing v88 source instead:)

What are you even talking about? I've never ever downloaded that crappy non-gms like source, even when i got the offer to have the source before it was released ... maybe you should stop leeching crap from NinjaMS before telling me what I took.

@rmzero

could possibly explain to me more, about what I did wrong? My packet knowledge is very weak. kevin1hai@live.com
 
Newbie Spellweaver
Joined
Apr 13, 2010
Messages
53
Reaction score
19
Re: Lmao......

Firstable I didn't say you did something wrong Second Mapleblade has the same ring code :eek:tt1:
 
Experienced Elementalist
Joined
Aug 20, 2009
Messages
272
Reaction score
49
Re: Lmao......

Firstable I didn't say you did something wrong Second Mapleblade has the same ring code :eek:tt1:

maybe kev sold it to them?
 
Junior Spellweaver
Joined
Oct 27, 2008
Messages
163
Reaction score
2
Re: v83 3rd Person Ring Effects

Umm that didn't answer MY question, but whatever


o_O

*sighs* Someone says that this release is from MapleBlade's source. This release is "3rd person rings," but it's really 1st person. If this code is the same as MapleBlade's then I'm guessing that MapleBlade has working rings? So basically if this release proves that MapleBlade has working 1st person rings then yes but I'm not sure if it means fully to you (like gifting etc in MapleBlade).
 
Last edited:
Joined
Nov 27, 2009
Messages
442
Reaction score
230
Re: v83 3rd Person Ring Effects

So you got this from LocalMS?

Why would I release this, if it's already in LocalMS?

MapleBlade/LocalMS diddn't include addItemInfo, getCharInfo, nor spawnPlayerMapObject. AddAllRingPacketInfo was a method I made myself, so no other repack has it.
 
Last edited:
Status
Not open for further replies.
Back
Top