
Rootware
Legendary Member-
Posts
1,370 -
Credits
0 -
Joined
-
Last visited
-
Days Won
14 -
Feedback
100%
Content Type
Articles
Profiles
Forums
Store
Everything posted by Rootware
-
Share Custom News notification system for your .menu
Rootware replied to LordPanic's topic in Server Shares & Files [L2J]
Not sure, but bypass string have limitation in 255 symbols. Isn't it? Maybe better to use WriteBBS command and have ability to input large texts? -
Code Elegant disabling the spells of all shot types
Rootware replied to Rootware's topic in Server Shares & Files [L2J]
I think that pointles to make diff because not all parts of code completed. I meant the trigger for skipping spells. -
Code Elegant disabling the spells of all shot types
Rootware replied to Rootware's topic in Server Shares & Files [L2J]
Your diff is outdated. Was added soulshot fix in Attack packet. -
Some time ago i helped someone with disabling shot spells. So, the next code it's more elegant solution than my previous guide. Example of course will for aCis but adapt for any other pack not a problem, i guess. For broadcasting all shot spells except soulshot uses broadcastPacketInRadius method into Creature.java. So, then we changing him. public void broadcastPacketInRadius(GameServerPacket packet, int radius) { if (radius < 0) radius = 600; // Check if packet is MagicSkillUse. final boolean isMagicSkillUse = (packet instanceof MagicSkillUse); for (final Player player : getKnownTypeInRadius(Player.class, radius)) { // Check if magicSkillUse contains Shot's skill and check if player disabled shot spells. if (isMagicSkillUse && SkillTable.isShotSkill(((MagicSkillUse) packet).getSkillId()) && player.getGameSettings().isBlockedShotEffect()) continue; player.sendPacket(packet); } } Next one step we add fix for soulshot spells broadcasting via broadcastPacket() method. public void broadcastPacket(GameServerPacket packet, boolean selfToo) { final boolean isAttackWithShots = (packet instanceof Attack) && ((Attack) packet).soulshot; Attack attackPacket = null; if (isAttackWithShots) { attackPacket = new Attack(((Attack) packet).getAttacker(), false, 0); final HitHolder[] holder = ((Attack) packet).getHits(); final HitHolder[] newHolder = new HitHolder[holder.length]; // This magic need for cleanup FLAG bit mask from SS usage. for (int i = 0; i < newHolder.length; i++) newHolder[i] = new HitHolder(holder[i]._target, holder[i]._damage, holder[i]._crit, holder[i]._miss, holder[i]._shld); // Generating FLAG bit mast anew. attackPacket.processHits(newHolder); } for (final Player player : getKnownType(Player.class)) { if (isAttackWithShots && player.getGameSettings().isBlockedShotEffect() && attackPacket != null) { player.sendPacket(attackPacket); continue; } player.sendPacket(packet); } } Next one step we add return methods for some fields in Attack packet. Don't forget change field INT to Creature for storing attaker as object, and not object ID. And add changes into constuct method also. public Creature getAttacker() { return _attacker; } public HitHolder[] getHits() { return _hits; } Next one step add method inside MagicSkillUse packet for getting skill id of sendable skill. public int getSkillId() { return _skillId; } Next one step add into SkillTable array with shot's skill IDs and method for checking them. private static final int[] _shotSkillsId = { 2008, 2009, 2033, 2039, 2047, 2061, 2150, 2151, 2152, 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2181, 2182, 2183, 2184, 2185, 2186 }; public static boolean isShotSkill(int skillId) { for (int id : _shotSkillsId) if (id == skillId) return true; return false; } Next one step is addition trigger option for store player configuration as i'm uses (player.getGameSettings().isBlockedShotEffect()). I uses separated GameSetting instance for all player's settings. You can make directly the new field inside Player.java and use like player.isBlockedShotEffect(). That's all what you need. This code disable all spells (SoulShot, SpritShot, Blessed SpiritShot, Beats Shot, Fishing Shot) from other objects except your spells. If you need add own servitor spell seeing then just add new return method in MagicSkillUse for get caster object IOD and thek him with your servitor object ID.
-
Help restricted zones
Rootware replied to dramaa93's question in Request Server Development Help [L2J]
Depending what you want to get. -
Help restricted zones
Rootware replied to dramaa93's question in Request Server Development Help [L2J]
All zone properties you can find into "zones" folder inside XML folder. -
http://rootware.ru/lineage-2-interlude-client/ http://rootware.ru/l2-file-edit-v-2/
-
Assume, what this item isn't registered for this scroll or crystal type mismatches. Anyway you need debug isValid() method in EnchantScroll and AbstractEnchantItem classes. By the way. I didn't understood a logic in this validation. public boolean isValid(ItemInstance itemToEnchant, EnchantSupportItem supportItem) { if ((_items != null) && !_items.contains(itemToEnchant.getId())) { // If _items isn't null check registered Item Id. return false; } else if ((supportItem != null)) { if (_isBlessed) { return false; } else if (!supportItem.isValid(itemToEnchant, supportItem)) { return false; } else if (supportItem.isWeapon() != isWeapon()) { return false; } } if (_items == null) { // If _items Set is null get all scrolls. for (EnchantScroll scroll : EnchantItemData.getInstance().getScrolls()) { if (scroll.getId() == getId()) { continue; } final Set<Integer> scrollItems = scroll.getItems(); // here we get the Set from _items field via local getter method (already checked before). LMAO. if ((scrollItems != null) && scrollItems.contains(itemToEnchant.getId())) { // If scroll exists and item for enchanting isn't registered then fault. return false; } } } // Calls here super class with checking Grade and etc. return super.isValid(itemToEnchant, supportItem); } Correct me if i'm wrong.
-
Add debug messages into RequestExTryToPutEnchantTargetItem packet for known what missed. /* * This file is part of the L2J Mobius project. * * 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 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.l2jmobius.gameserver.network.clientpackets; import java.util.logging.Level; import org.l2jmobius.commons.network.PacketReader; import org.l2jmobius.commons.util.Chronos; import org.l2jmobius.gameserver.data.xml.EnchantItemData; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.items.enchant.EnchantScroll; import org.l2jmobius.gameserver.model.items.instance.ItemInstance; import org.l2jmobius.gameserver.network.GameClient; import org.l2jmobius.gameserver.network.SystemMessageId; import org.l2jmobius.gameserver.network.serverpackets.ExPutEnchantTargetItemResult; /** * @author KenM */ public class RequestExTryToPutEnchantTargetItem implements IClientIncomingPacket { private int _objectId; @Override public boolean read(GameClient client, PacketReader packet) { _objectId = packet.readD(); return true; } @Override public void run(GameClient client) { final PlayerInstance player = client.getPlayer(); if ((_objectId == 0) || (player == null)) { return; } if (player.isEnchanting()) { return; } final ItemInstance item = player.getInventory().getItemByObjectId(_objectId); final ItemInstance scroll = player.getInventory().getItemByObjectId(player.getActiveEnchantItemId()); if ((item == null) || (scroll == null)) { return; } final EnchantScroll scrollTemplate = EnchantItemData.getInstance().getEnchantScroll(scroll); if ((scrollTemplate == null) || !scrollTemplate.isValid(item, null)) { player.sendMessage("Scrol template is " + (scrollTemplate == null ? "null" : "not noll")); player.sendMessage("Item is " + (scrollTemplate.isValid(item, null) ? "valid" : "not valid") + " for this scroll template."); player.sendPacket(SystemMessageId.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL); player.setActiveEnchantItemId(PlayerInstance.ID_NONE); player.sendPacket(new ExPutEnchantTargetItemResult(0)); if (scrollTemplate == null) { LOGGER.log(Level.WARNING, getClass().getSimpleName() + ": Undefined scroll have been used id: " + scroll.getId()); } return; } player.setEnchanting(true); player.setActiveEnchantTimestamp(Chronos.currentTimeMillis()); player.sendPacket(new ExPutEnchantTargetItemResult(_objectId)); } } I guess you broken something with your customs and reconfig.
-
Check log files for searching errors with loading EnchantData. Maybe missed pathway or file corrupted.
-
Help Need fix for this minimap radar issue - WILLING TO PAY
Rootware replied to darta's topic in [Request] Client Dev Help
Try to use interface.xdat and interface.u from another client. For test you use even from lower chronicles this files. -
Check the conditions here. public class RequestExTryToPutEnchantTargetItem implements IClientIncomingPacket { private int _objectId; @Override public boolean read(GameClient client, PacketReader packet) { _objectId = packet.readD(); return true; } @Override public void run(GameClient client) { final PlayerInstance player = client.getPlayer(); if ((_objectId == 0) || (player == null)) { return; } if (player.isEnchanting()) { return; } final ItemInstance item = player.getInventory().getItemByObjectId(_objectId); final ItemInstance scroll = player.getInventory().getItemByObjectId(player.getActiveEnchantItemId()); if ((item == null) || (scroll == null)) { return; } final EnchantScroll scrollTemplate = EnchantItemData.getInstance().getEnchantScroll(scroll); if ((scrollTemplate == null) || !scrollTemplate.isValid(item, null)) { player.sendPacket(SystemMessageId.DOES_NOT_FIT_STRENGTHENING_CONDITIONS_OF_THE_SCROLL); player.setActiveEnchantItemId(PlayerInstance.ID_NONE); player.sendPacket(new ExPutEnchantTargetItemResult(0)); if (scrollTemplate == null) { LOGGER.log(Level.WARNING, getClass().getSimpleName() + ": Undefined scroll have been used id: " + scroll.getId()); } return; } player.setEnchanting(true); player.setActiveEnchantTimestamp(Chronos.currentTimeMillis()); player.sendPacket(new ExPutEnchantTargetItemResult(_objectId)); } } Validation method. public boolean isValid(ItemInstance itemToEnchant, EnchantSupportItem supportItem) { if ((_items != null) && !_items.contains(itemToEnchant.getId())) { return false; } else if ((supportItem != null)) { if (_isBlessed) { return false; } else if (!supportItem.isValid(itemToEnchant, supportItem)) { return false; } else if (supportItem.isWeapon() != isWeapon()) { return false; } } if (_items == null) { for (EnchantScroll scroll : EnchantItemData.getInstance().getScrolls()) { if (scroll.getId() == getId()) { continue; } final Set<Integer> scrollItems = scroll.getItems(); if ((scrollItems != null) && scrollItems.contains(itemToEnchant.getId())) { return false; } } } return super.isValid(itemToEnchant, supportItem); } The general problem is Enchant scroll isn't defined in EnchantItemData, i guess.
-
You can use as example AccessLevel pattern for you Premium system.
-
Pointless, IMHO. final PremiumLevel premiumLevel = PremiumLevel.VALUES[levelId]; or final PremiumLevel premiumLevel = Enum.valueOf(PremiumLevel.class "GOLD"); or add into PremiumLevel enum one more method: public static PremiumLevel getPremiumLevel(int levelId) { for (PremiumLevel bit : VALUES) if (bit.getId() == levelId) return bit; return NONE; } and use final PremiumLevel premiumLevel = PremiumLevel.getPremiumLevel(levelId);
-
Make PremiumLevel enum like: public enum PremiumLevel { NONE(0), BRONZE(1), SILVER(2), GOLD(3); public static final PremiumLevel[] VALUES = values(); private final int _id; private PremiumLevel(int id) { _id = id; } public int getId() { return _id; } public boolean isGreater(PremiumLevel premiumLevel) { return getId() > premiumLevel.getId(); } public boolean isLesser(PremiumLevel premiumLevel) { return getId() < premiumLevel.getId(); } } And manage following this states as you want. The more elegant solution don't find.
-
Help Need help l2jacis, I will be grateful!
Rootware replied to P1ckw1ck's question in Request Server Development Help [L2J]
So, wrong Java or wrong specified here aCis revision? -
Help Disable Clan Window, L2JACIS
Rootware replied to Kotegaeshi92's question in Request Server Development Help [L2J]
Very weird a wish. -
Help Need help l2jacis, I will be grateful!
Rootware replied to P1ckw1ck's question in Request Server Development Help [L2J]
Which java you a uses for compilation, JRE or JDK in project properties? -
Share Classic Interface Interlude Automatic Functions
Rootware replied to Noxy's topic in Client Development Discussion
Nice share. -
Help Clan Privs bug l2jacis
Rootware replied to TreVor's question in Request Server Development Help [L2J]
Which the aCis revision you uses? -
Follows UEngine::Exec decompiled function from Engine.dll i posted here all available builder's client commands. Maybe it will useful for someone. ///flush ///stat [anim|default|reset|fps|render|hardware|game|histograph|xboxmem|matinee|audio|net|packetcount|expacketcount|all|none|console|l2|mem|thread|script|scriptr] ///crackurl ///packetcountstart ///packetcountstop ///expacketcountstart ///expacketcountstop ///reload ///replaysave [start|end] ///replayload [replay name, e.g. Rep00000] ///buildlevel ///releaselevel ///fakeitem Raw (C language) function for the most curious: int __userpurge UEngine::Exec@<eax>(UEngine *this@<ecx>, double a2@<st0>, const wchar_t *a3, struct FOutputDevice *a4) { UEngine *v4; // esi struct FOutputDevice *v5; // edi int v6; // ecx int v7; // eax int v8; // ecx int result; // eax BOOL v10; // eax int v11; // ecx _DWORD *v12; // esi _DWORD *v13; // eax int v14; // eax int v15; // eax int i; // ebx int v17; // eax int v18; // eax void *v19; // eax int v20; // eax int v21; // ecx int v22; // ecx int v23; // ecx int v24; // ecx int v25; // esi int v26; // eax int *v27; // esi int v28; // edx FL2ReplayManager *v29; // ecx int v30; // eax int v31; // eax int v32; // [esp-Ch] [ebp-A8h] int v33; // [esp-8h] [ebp-A4h] int *v34; // [esp-4h] [ebp-A0h] int v35; // [esp+0h] [ebp-9Ch] int v36; // [esp+Ch] [ebp-90h] int v37; // [esp+18h] [ebp-84h] int v38; // [esp+24h] [ebp-78h] int v39; // [esp+28h] [ebp-74h] int v40; // [esp+34h] [ebp-68h] int v41; // [esp+38h] [ebp-64h] int v42; // [esp+40h] [ebp-5Ch] int v43; // [esp+4Ch] [ebp-50h] int v44; // [esp+50h] [ebp-4Ch] char v45; // [esp+68h] [ebp-34h] int v46; // [esp+74h] [ebp-28h] char v47; // [esp+78h] [ebp-24h] int v48; // [esp+7Ch] [ebp-20h] int v49; // [esp+88h] [ebp-14h] int *v50; // [esp+8Ch] [ebp-10h] int v51; // [esp+98h] [ebp-4h] v50 = &v35; v4 = this; v51 = 0; v5 = a4; if ( *(_DWORD *)GSys && (**(int (__stdcall ***)(const wchar_t *, struct FOutputDevice *))(*(_DWORD *)GSys + 52))(a3, a4) ) { return 1; } if ( UObject::StaticExec(a3, v5) || FMemCache::Exec(&GCache, a3, v5) || *(_DWORD *)GExec && (***(int (__stdcall ****)(const wchar_t *, struct FOutputDevice *))GExec)(a3, v5) ) { return 1; } v6 = *((_DWORD *)v4 + 9); if ( v6 ) { if ( (*(int (__stdcall **)(const wchar_t *, struct FOutputDevice *))(*(_DWORD *)v6 + 136))(a3, v5) ) return 1; } v7 = *((_DWORD *)v4 + 10); if ( v7 ) { if ( (**(int (__stdcall ***)(const wchar_t *, struct FOutputDevice *))(v7 + 52))(a3, v5) ) return 1; } if ( dword_2077ED44 && sub_20414540((int)a3) ) return 1; v8 = *((_DWORD *)v4 + 15); if ( v8 ) { if ( (*(int (__stdcall **)(const wchar_t *))(*(_DWORD *)v8 + 1588))(a3) ) return 1; } if ( ParseCommand(&a3, L"FLUSH") ) { (*(void (__stdcall **)(signed int))(*((_DWORD *)v4 - 13) + 120))(1); FOutputDevice::Log(v5, L"Flushed engine caches"); return 1; } if ( ParseCommand(&a3, L"STAT") ) { if ( ParseCommand(&a3, L"ANIM") ) { *((_DWORD *)v4 + 24) = *((_DWORD *)v4 + 24) == 0; return 1; } if ( ParseCommand(&a3, L"DEFAULT") || ParseCommand(&a3, L"RESET") ) { *((_DWORD *)v4 + 24) = 0; *((_DWORD *)v4 + 20) = 0; *((_DWORD *)v4 + 21) = 0; *((_DWORD *)v4 + 27) = 0; *((_DWORD *)v4 + 22) = 0; *((_DWORD *)v4 + 28) = 0; *((_DWORD *)v4 + 23) = 0; *((_DWORD *)v4 + 25) = 0; *((_DWORD *)v4 + 30) = 0; *((_DWORD *)v4 + 31) = 0; *((_DWORD *)v4 + 32) = 0; *((_DWORD *)v4 + 33) = 0; *((_DWORD *)v4 + 34) = 0; *((_DWORD *)v4 + 35) = 0; *((_DWORD *)v4 + 36) = 0; return 1; } if ( ParseCommand(&a3, L"FPS") ) { *((_DWORD *)v4 + 19) = *((_DWORD *)v4 + 19) == 0; return 1; } if ( ParseCommand(&a3, L"RENDER") ) { *((_DWORD *)v4 + 20) = *((_DWORD *)v4 + 20) == 0; return 1; } if ( ParseCommand(&a3, L"HARDWARE") ) { *((_DWORD *)v4 + 21) = *((_DWORD *)v4 + 21) == 0; return 1; } if ( ParseCommand(&a3, L"GAME") ) { *((_DWORD *)v4 + 22) = *((_DWORD *)v4 + 22) == 0; return 1; } if ( ParseCommand(&a3, L"HISTOGRAPH") ) { *((_DWORD *)v4 + 25) = *((_DWORD *)v4 + 25) == 0; return 1; } if ( ParseCommand(&a3, L"XBOXMEM") ) { *((_DWORD *)v4 + 26) = *((_DWORD *)v4 + 26) == 0; return 1; } if ( ParseCommand(&a3, L"MATINEE") ) { *((_DWORD *)v4 + 27) = *((_DWORD *)v4 + 27) == 0; return 1; } if ( ParseCommand(&a3, L"AUDIO") ) { *((_DWORD *)v4 + 28) = *((_DWORD *)v4 + 28) == 0; return 1; } if ( ParseCommand(&a3, L"NET") ) { *((_DWORD *)v4 + 23) = *((_DWORD *)v4 + 23) == 0; return 1; } if ( ParseCommand(&a3, L"PACKETCOUNT") ) { *((_DWORD *)v4 + 32) = *((_DWORD *)v4 + 32) == 0; return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNT") ) { *((_DWORD *)v4 + 33) = *((_DWORD *)v4 + 33) == 0; return 1; } if ( ParseCommand(&a3, L"ALL") ) { result = 1; *((_DWORD *)v4 + 19) = 1; *((_DWORD *)v4 + 20) = 1; *((_DWORD *)v4 + 21) = 1; *((_DWORD *)v4 + 27) = 1; *((_DWORD *)v4 + 22) = 1; *((_DWORD *)v4 + 28) = 1; *((_DWORD *)v4 + 23) = 1; *((_DWORD *)v4 + 30) = 1; *((_DWORD *)v4 + 31) = 1; *((_DWORD *)v4 + 34) = 1; *((_DWORD *)v4 + 35) = 1; return result; } if ( ParseCommand(&a3, L"NONE") ) { v10 = 0; *((_DWORD *)v4 + 24) = 0; *((_DWORD *)v4 + 19) = 0; *((_DWORD *)v4 + 20) = 0; *((_DWORD *)v4 + 21) = 0; *((_DWORD *)v4 + 27) = 0; *((_DWORD *)v4 + 22) = 0; *((_DWORD *)v4 + 28) = 0; *((_DWORD *)v4 + 23) = 0; *((_DWORD *)v4 + 30) = 0; *((_DWORD *)v4 + 31) = 0; *((_DWORD *)v4 + 32) = 0; *((_DWORD *)v4 + 33) = 0; *((_DWORD *)v4 + 34) = 0; LABEL_48: *((_DWORD *)v4 + 35) = v10; return 1; } if ( ParseCommand(&a3, L"CONSOLE") ) { *((_DWORD *)v4 + 49) = *((_DWORD *)v4 + 49) == 0; return 1; } if ( ParseCommand(&a3, L"L2") ) { *((_DWORD *)v4 + 30) = *((_DWORD *)v4 + 30) == 0; return 1; } if ( ParseCommand(&a3, L"MEM") ) { *((_DWORD *)v4 + 31) = *((_DWORD *)v4 + 31) == 0; return 1; } if ( ParseCommand(&a3, L"Thread") ) { *((_DWORD *)v4 + 34) = *((_DWORD *)v4 + 34) == 0; return 1; } if ( ParseCommand(&a3, L"Script") ) { v10 = *((_DWORD *)v4 + 35) == 0; goto LABEL_48; } if ( ParseCommand(&a3, L"ScriptR") ) { sub_200DE330(&v45); LOBYTE(v51) = 1; sub_200DE3C0(v11, (int *)&v47); v12 = UObject::GObjObjects; while ( v48 < v12[1] ) { v13 = *(_DWORD **)(*v12 + 4 * v48); if ( v13 ) { v13[40] = 0; v13[41] = 0; v13[42] = 0; v13[43] = 0; v12 = UObject::GObjObjects; } sub_20005C90(0, (int *)&v47); } LOBYTE(v51) = 0; sub_200DE370((int)&v45); return 1; } } else { if ( ParseCommand(&a3, L"CRACKURL") ) { FURL::FURL((FURL *)&v36, 0, (int)a3, 0); LOBYTE(v51) = 2; if ( v43 ) { v14 = FString::operator*(&v36); FOutputDevice::Logf(v5, (const char *)L" Protocol: %s", v14); v15 = FString::operator*(&v37); FOutputDevice::Logf(v5, (const char *)L" Host: %s", v15); FOutputDevice::Logf(v5, (const char *)L" Port: %i", v38); v34 = (int *)FString::operator*(&v39); FOutputDevice::Logf(v5, (const char *)L" Map: %s", v34); FOutputDevice::Logf(v5, (const char *)L" NumOptions: %i", v41); for ( i = 0; ; ++i ) { v49 = i; if ( i >= v41 ) break; v17 = FString::operator*(v40 + 12 * i); FOutputDevice::Logf(v5, (const char *)L" Option %i: %s", i, v17); } v18 = FString::operator*(&v42); FOutputDevice::Logf(v5, (const char *)L" Portal: %s", v18); v19 = FURL::String(&v36, &v45, 0); LOBYTE(v51) = 3; v20 = FString::operator*(v19); FOutputDevice::Logf(v5, (const char *)L" String: '%s'", v20); LOBYTE(v51) = 2; FString::~FString(&v45); LOBYTE(v51) = 0; FURL::~FURL((FURL *)&v36); } else { FOutputDevice::Logf(v5, L"BAD URL"); LOBYTE(v51) = 0; FURL::~FURL((FURL *)&v36); } return 1; } if ( ParseCommand(&a3, L"PACKETCOUNTSTART") ) { v21 = *((_DWORD *)v4 + 13); if ( v21 ) { (*(void (**)(void))(*(_DWORD *)v21 + 116))(); *((_DWORD *)v4 + 32) = 1; } return 1; } if ( ParseCommand(&a3, L"PACKETCOUNTSTOP") ) { v22 = *((_DWORD *)v4 + 13); if ( v22 ) { (*(void (**)(void))(*(_DWORD *)v22 + 120))(); *((_DWORD *)v4 + 32) = 0; } return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNTSTART") ) { v23 = *((_DWORD *)v4 + 13); if ( v23 ) { (*(void (**)(void))(*(_DWORD *)v23 + 124))(); *((_DWORD *)v4 + 33) = 1; } return 1; } if ( ParseCommand(&a3, L"EXPACKETCOUNTSTOP") ) { v24 = *((_DWORD *)v4 + 13); if ( v24 ) { (*(void (**)(void))(*(_DWORD *)v24 + 128))(); *((_DWORD *)v4 + 33) = 0; } return 1; } if ( ParseCommand(&a3, L"RELOAD") ) { v25 = *((_DWORD *)v4 + 13); if ( v25 ) (*(void (__thiscall **)(int))(*(_DWORD *)v25 + 1180))(v25); return 1; } if ( ParseCommand(&a3, L"REPLAYSAVE") ) { if ( *((_DWORD *)v4 + 13) && *((_DWORD *)v4 + 92) ) { if ( ParseCommand(&a3, L"START") ) { if ( !*(_DWORD *)(*((_DWORD *)v4 + 92) + 23904) ) { FString::FString(&v46); LOBYTE(v51) = 4; v26 = ParseToken(&v45, &a3, 0); LOBYTE(v51) = 5; FString::operator=(&v46, v26); LOBYTE(v51) = 4; FString::~FString(&v45); *(_DWORD *)(*((_DWORD *)v4 + 92) + 24020) = 0; a4 = (struct FOutputDevice *)&v32; FString::FString(&v32, &v46); LOBYTE(v51) = 4; FL2ReplayManager::PrepareSave(*((_DWORD **)v4 + 92), v32, v33, (int)v34); L2ParamStack::L2ParamStack(&v44, 10); LOBYTE(v51) = 7; L2ParamStack::PushBack(&v44, L"reload", (signed int)L"reload" >> 31); v27 = (int *)*((_DWORD *)v4 + 13); v28 = *v27; v34 = &v44; (*(void (__thiscall **)(int *, int *))(v28 + 688))(v27, &v44); LOBYTE(v51) = 4; L2ParamStack::~L2ParamStack(&v44); LOBYTE(v51) = 0; FString::~FString(&v46); return 1; } } else if ( ParseCommand(&a3, L"END") ) { v29 = (FL2ReplayManager *)*((_DWORD *)v4 + 92); if ( *((_DWORD *)v29 + 5976) == 2 ) { FL2ReplayManager::Save(v29, (int)ParseCommand, a2); FL2ReplayManager::Clear(*((FL2ReplayManager **)v4 + 92), -1); result = 1; *(_DWORD *)(*((_DWORD *)v4 + 92) + 24020) = 1; return result; } } } } else if ( ParseCommand(&a3, L"REPLAYLOAD") ) { if ( *((_DWORD *)v4 + 13) ) { v30 = *((_DWORD *)v4 + 92); if ( v30 ) { if ( !*(_DWORD *)(v30 + 23904) ) { FString::FString(&v46); LOBYTE(v51) = 8; v31 = ParseToken(&v45, &a3, 0); LOBYTE(v51) = 9; FString::operator=(&v46, v31); LOBYTE(v51) = 8; FString::~FString(&v45); if ( FL2ReplayManager::SetSceneName(*((FL2ReplayManager **)v4 + 92), (const struct FString *)&v46) ) { FL2ReplayManager::SetState(*((FL2ReplayManager **)v4 + 92), 3); LOBYTE(v51) = 0; FString::~FString(&v46); return 1; } LOBYTE(v51) = 0; FString::~FString(&v46); } } } } else { if ( ParseCommand(&a3, L"BuildLevel") || ParseCommand(&a3, L"ReleaseLevel") ) { v34 = (int *)9; debugf(L"L2 Release Level = %d"); return 1; } if ( ParseCommand(&a3, L"FAKEITEM") ) { *(_DWORD *)GL2CheckFakeItem = *(_DWORD *)GL2CheckFakeItem == 0; return 1; } } } return 0; } This is the small list of client commands. The full list you can find inside UInput::Exec function. https://pastebin.com/Uu1ayPW3 P.S. Some funny commands: ///bighead - enable big head for self; ///firecracker - make a firework for target; ///observer [on|off] - show hide the player texture and names.
-
- 4
-
-
-
-
Request looking for this code
Rootware replied to Irrelevant's question in Request Server Development Help [L2J]
Vanilla aCis have no this feature overall. -
Help Item on inventory which can change time of buffs !
Rootware replied to 0flee's question in Request Server Development Help [L2J]
And changing skill duration time "on fly" in Mobius really works? -
This is the decompiled L2OFF Freya AI.obj. https://www.4shared.com/zip/IGQlTobciq/ai-freya-symbol.html About incomprehensible AI handlers ask in L2OFF section.