Fake players for HighFive.

This commit is contained in:
MobiusDev
2018-04-13 14:03:39 +00:00
parent be8e28e974
commit 0807932e6d
54 changed files with 1886 additions and 152 deletions

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Use lowercase for searchText and answers. -->
<!-- You can use specific fpcName or ALL to use with all fpcs. -->
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerChatData.xsd">
<fakePlayerChat fpcName="ALL" searchMethod="EQUALS" searchText="hi" answers="hello;hi;hi there;hello there" />
<fakePlayerChat fpcName="ALL" searchMethod="EQUALS" searchText="hey" answers="hey hey;hey;hey there" />
<fakePlayerChat fpcName="ALL" searchMethod="EQUALS" searchText="hello" answers="hello;hi;hi there;hello there" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="here?" answers="yes;busy;i look for something" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="whats up?" answers="good;busy;i look for something" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="what?" answers="something :P;something for me" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="why?" answers="because;i don't know;what?" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="really" answers="really;yes;of course" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="thanks" answers=":);:D;:*" />
<fakePlayerChat fpcName="Evi" searchMethod="EQUALS" searchText="thank you" answers=":);:D;:*" />
<fakePlayerChat fpcName="Evi" searchMethod="STARTS_WITH" searchText="how are you" answers="fine;good;busy" />
<fakePlayerChat fpcName="Evi" searchMethod="STARTS_WITH" searchText="do you know" answers="nope;no sorry;nope, i don't" />
<fakePlayerChat fpcName="Evi" searchMethod="STARTS_WITH" searchText="where can i" answers="i don't know;no clue;ask someone else :P" />
<fakePlayerChat fpcName="Evi" searchMethod="STARTS_WITH" searchText="can i ask you" answers="yes;what?;tell me" />
<fakePlayerChat fpcName="Evi" searchMethod="CONTAINS" searchText="server;ha;problem" answers="it's good;i don't know;i don't think so..." />
<fakePlayerChat fpcName="Evi" searchMethod="CONTAINS" searchText="server;ha;bug" answers="it's good;i don't know;i don't think so..." />
<fakePlayerChat fpcName="Evi" searchMethod="CONTAINS" searchText="is th;server;good" answers="it's good :D;i like it :P;yes it is :)" />
<fakePlayerChat fpcName="Evi" searchMethod="CONTAINS" searchText="where;you;go;?" answers="i look for something;checking stuff;looking for curius people :P" />
<fakePlayerChat fpcName="Evi" searchMethod="CONTAINS" searchText="are;you;kidding" answers="^^;:D;:P" />
</list>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Values that can be set:
int classId, int hair, int hairColor, int face, int nameColor, int titleColor, int equipRHand, int equipLHand, int equipHead,
int equipGloves, int equipChest, int equipLegs, int equipFeet, int equipCloak, int equipHair, int equipHair2, int agathionId,
int weaponEnchantLevel, int armorEnchantLevel, boolean fishing, int baitLocationX, int baitLocationY, int baitLocationZ,
int recommends, int nobleLevel, boolean hero, int clanId, int pledgeStatus -->
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerVisualData.xsd">
<!-- Non-Combat -->
<fakePlayer npcId="80000" classId="107" hair="1" hairColor="0" face="0" equipRHand="5706" equipHead="2419" equipGloves="5774" equipChest="2383" equipFeet="5786" />
<!-- Combat -->
<!-- Duelist -->
<fakePlayer npcId="81001" classId="88" hair="0" hairColor="0" face="0" equipRHand="5706" equipHead="2419" equipGloves="5774" equipChest="2383" equipFeet="5786" />
</list>

View File

@@ -9,15 +9,37 @@
<!-- npcStringId = to use String IDs from client NpcString-e.dat -->
<!-- string = to use any custom text, example: string="Hello World" -->
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/Routes.xsd">
<!-- Just test route - Giran town square -->
<route name="test_route" repeat="true" repeatStyle="cycle">
<point X="80863" Y="148339" Z="-3469" delay="0" run="true" />
<point X="80904" Y="147653" Z="-3469" delay="0" run="true" />
<point X="83205" Y="147646" Z="-3469" delay="0" run="true" />
<point X="82189" Y="148347" Z="-3467" delay="0" run="true" />
<point X="81862" Y="148266" Z="-3467" delay="0" run="true" />
<point X="81918" Y="148352" Z="-3467" delay="0" run="true" />
<point X="81937" Y="149173" Z="-3469" delay="0" run="true" />
<route name="FPC_Giran_Evi" repeat="true" repeatStyle="cycle">
<target id="80000" spawnX="83485" spawnY="147998" spawnZ="-3407" />
<point X="83485" Y="147998" Z="-3407" delay="10" run="true" /> <!-- Gatekeeper -->
<point X="82853" Y="148022" Z="-3470" delay="0" run="true" />
<point X="82117" Y="147642" Z="-3469" delay="0" run="true" />
<point X="82084" Y="147569" Z="-3469" delay="12" run="true" /> <!-- Olympiad Manager -->
<point X="81532" Y="147578" Z="-3469" delay="0" run="true" />
<point X="81593" Y="146626" Z="-3533" delay="3" run="true" />
<point X="81932" Y="146566" Z="-3533" delay="0" run="true" />
<point X="82651" Y="146714" Z="-3466" delay="20" run="true" /> <!-- Dimesional Merchant -->
<point X="82807" Y="146649" Z="-3465" delay="0" run="true" />
<point X="83192" Y="146680" Z="-3464" delay="28" run="true" /> <!-- Warehouse -->
<point X="83198" Y="146731" Z="-3469" delay="88" run="true" /> <!-- Warehouse 2 -->
<point X="81659" Y="146555" Z="-3533" delay="3" run="true" />
<point X="81283" Y="145519" Z="-3533" delay="0" run="true" />
<point X="80201" Y="145826" Z="-3524" delay="0" run="true" />
<point X="79968" Y="145826" Z="-3497" delay="0" run="true" />
<point X="79781" Y="145546" Z="-3496" delay="0" run="true" />
<point X="79736" Y="145518" Z="-3495" delay="0" run="true" />
<point X="79663" Y="145529" Z="-3496" delay="40" run="true" /> <!-- Galladucci -->
<point X="79661" Y="145429" Z="-3495" delay="80" run="true" /> <!-- Alexandria -->
<point X="79999" Y="145152" Z="-3496" delay="0" run="true" />
<point X="80393" Y="145136" Z="-3533" delay="0" run="true" />
<point X="81061" Y="145563" Z="-3533" delay="0" run="true" />
<point X="81563" Y="145532" Z="-3533" delay="3" run="true" />
<point X="81517" Y="147231" Z="-3533" delay="0" run="true" />
<point X="81542" Y="147570" Z="-3469" delay="0" run="true" />
<point X="81139" Y="148567" Z="-3469" delay="0" run="true" />
<point X="81413" Y="149700" Z="-3469" delay="52" run="true" /> <!-- Clan Hall Managers -->
<point X="82815" Y="148840" Z="-3469" delay="3" run="true" />
<point X="83318" Y="148422" Z="-3406" delay="0" run="true" />
</route>
<!-- Hellbound Town routes for Patrols -->
<route name="castletownguard01" repeat="true" repeatStyle="random">

View File

@@ -0,0 +1,80 @@
/*
* 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 custom.FakePlayers;
import com.l2jmobius.Config;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import ai.AbstractNpcAI;
/**
* TODO: Move it to L2Character.
* @author Mobius
*/
public class PvpFlaggingStopTask extends AbstractNpcAI
{
private PvpFlaggingStopTask()
{
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if ((npc == null) || npc.isDead())
{
return null;
}
if (event.startsWith("FLAG_CHECK"))
{
final L2Object target = npc.getTarget();
if ((target != null) && (target.isPlayable() || target.isFakePlayer()))
{
npc.setScriptValue(1); // in combat
cancelQuestTimer("FINISH_FLAG" + npc.getObjectId(), npc, null);
cancelQuestTimer("REMOVE_FLAG" + npc.getObjectId(), npc, null);
startQuestTimer("FINISH_FLAG" + npc.getObjectId(), Config.PVP_NORMAL_TIME - 20000, npc, null);
startQuestTimer("FLAG_CHECK" + npc.getObjectId(), 5000, npc, null);
}
}
else if (event.startsWith("FINISH_FLAG"))
{
if (npc.isScriptValue(1))
{
npc.setScriptValue(2); // blink status
npc.broadcastInfo(); // update flag status
startQuestTimer("REMOVE_FLAG" + npc.getObjectId(), 20000, npc, null);
}
}
else if (event.startsWith("REMOVE_FLAG"))
{
if (npc.isScriptValue(2))
{
npc.setScriptValue(0); // not in combat
npc.broadcastInfo(); // update flag status
}
}
return super.onAdvEvent(event, npc, player);
}
public static void main(String[] args)
{
new PvpFlaggingStopTask();
}
}

View File

@@ -74,6 +74,7 @@ import handlers.admincommandhandlers.AdminEnchant;
import handlers.admincommandhandlers.AdminEventEngine;
import handlers.admincommandhandlers.AdminEvents;
import handlers.admincommandhandlers.AdminExpSp;
import handlers.admincommandhandlers.AdminFakePlayers;
import handlers.admincommandhandlers.AdminFightCalculator;
import handlers.admincommandhandlers.AdminFortSiege;
import handlers.admincommandhandlers.AdminGamePoints;
@@ -369,6 +370,7 @@ public class MasterHandler
AdminEventEngine.class,
AdminEvents.class,
AdminExpSp.class,
AdminFakePlayers.class,
AdminFightCalculator.class,
AdminFortSiege.class,
AdminGamePoints.class,

View File

@@ -129,10 +129,14 @@ public class L2NpcAction implements IActionHandler
npc.showChatWindow(activeChar);
}
}
if ((Config.PLAYER_MOVEMENT_BLOCK_TIME > 0) && !activeChar.isGM())
if (Config.PLAYER_MOVEMENT_BLOCK_TIME > 0)
{
activeChar.updateNotMoveUntil();
}
if (npc.isFakePlayer() && GeoEngine.getInstance().canSeeTarget(activeChar, npc))
{
activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, npc);
}
}
}
}

View File

@@ -191,7 +191,7 @@ public class L2NpcActionShift implements IActionShiftHandler
}
else if (Config.ALT_GAME_VIEWNPC)
{
if (!target.isNpc())
if (!target.isNpc() || target.isFakePlayer())
{
return false;
}

View File

@@ -0,0 +1,78 @@
/*
* 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 handlers.admincommandhandlers;
import com.l2jmobius.gameserver.data.xml.impl.FakePlayerData;
import com.l2jmobius.gameserver.handler.IAdminCommandHandler;
import com.l2jmobius.gameserver.instancemanager.FakePlayerChatManager;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
/**
* @author Mobius
*/
public class AdminFakePlayers implements IAdminCommandHandler
{
private static final String[] ADMIN_COMMANDS =
{
"admin_fakechat"
};
@Override
public boolean useAdminCommand(String command, L2PcInstance activeChar)
{
if (command.startsWith("admin_fakechat"))
{
final String[] words = command.substring(15).split(" ");
if (words.length < 3)
{
activeChar.sendMessage("Usage: //fakechat playername fpcname message");
return false;
}
final L2PcInstance player = L2World.getInstance().getPlayer(words[0]);
if (player == null)
{
activeChar.sendMessage("Player not found.");
return false;
}
final String fpcName = FakePlayerData.getInstance().getProperName(words[1]);
if (fpcName == null)
{
activeChar.sendMessage("Fake player not found.");
return false;
}
String message = "";
for (int i = 0; i < words.length; i++)
{
if (i < 2)
{
continue;
}
message += (words[i] + " ");
}
FakePlayerChatManager.getInstance().sendChat(player, fpcName, message);
activeChar.sendMessage("Your message has been sent.");
}
return true;
}
@Override
public String[] getAdminCommandList()
{
return ADMIN_COMMANDS;
}
}

View File

@@ -30,6 +30,7 @@ import com.l2jmobius.gameserver.data.xml.impl.BuyListData;
import com.l2jmobius.gameserver.data.xml.impl.DoorData;
import com.l2jmobius.gameserver.data.xml.impl.EnchantItemData;
import com.l2jmobius.gameserver.data.xml.impl.EnchantItemGroupsData;
import com.l2jmobius.gameserver.data.xml.impl.FakePlayerData;
import com.l2jmobius.gameserver.data.xml.impl.MultisellData;
import com.l2jmobius.gameserver.data.xml.impl.NpcData;
import com.l2jmobius.gameserver.data.xml.impl.PrimeShopData;
@@ -38,9 +39,12 @@ import com.l2jmobius.gameserver.data.xml.impl.TransformData;
import com.l2jmobius.gameserver.datatables.ItemTable;
import com.l2jmobius.gameserver.handler.IAdminCommandHandler;
import com.l2jmobius.gameserver.instancemanager.CursedWeaponsManager;
import com.l2jmobius.gameserver.instancemanager.FakePlayerChatManager;
import com.l2jmobius.gameserver.instancemanager.QuestManager;
import com.l2jmobius.gameserver.instancemanager.WalkingManager;
import com.l2jmobius.gameserver.instancemanager.ZoneManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.scripting.ScriptEngineManager;
import com.l2jmobius.gameserver.util.Util;
@@ -247,11 +251,31 @@ public class AdminReload implements IAdminCommandHandler
break;
}
case "itemmall":
case "primeshop":
{
PrimeShopData.getInstance().load();
AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded item mall data.");
break;
}
case "fakeplayers":
{
FakePlayerData.getInstance().load();
for (L2Object obj : L2World.getInstance().getVisibleObjects())
{
if (obj.isFakePlayer())
{
obj.broadcastInfo();
}
}
AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Fake Player data.");
break;
}
case "fakeplayerchat":
{
FakePlayerChatManager.getInstance().load();
AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Fake Player Chat data.");
break;
}
default:
{
activeChar.sendMessage(RELOAD_USAGE);

View File

@@ -23,6 +23,7 @@ import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.l2jmobius.Config;
import com.l2jmobius.gameserver.SevenSigns;
import com.l2jmobius.gameserver.data.xml.impl.AdminData;
import com.l2jmobius.gameserver.data.xml.impl.NpcData;
@@ -413,6 +414,12 @@ public class AdminSpawn implements IAdminCommandHandler
template = NpcData.getInstance().getTemplateByName(monsterId.replace('_', ' '));
}
if (!Config.FAKE_PLAYERS_ENABLED && template.isFakePlayer())
{
activeChar.sendPacket(SystemMessageId.YOUR_TARGET_CANNOT_BE_FOUND);
return;
}
try
{
final L2Spawn spawn = new L2Spawn(template);

View File

@@ -17,8 +17,10 @@
package handlers.chathandlers;
import com.l2jmobius.Config;
import com.l2jmobius.gameserver.data.xml.impl.FakePlayerData;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.handler.IChatHandler;
import com.l2jmobius.gameserver.instancemanager.FakePlayerChatManager;
import com.l2jmobius.gameserver.model.BlockList;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.PcCondOverride;
@@ -58,6 +60,28 @@ public final class ChatWhisper implements IChatHandler
return;
}
if (Config.FAKE_PLAYERS_ENABLED && (FakePlayerData.getInstance().getProperName(target) != null))
{
if (FakePlayerData.getInstance().isTalkable(target))
{
if (Config.FAKE_PLAYER_CHAT)
{
final String name = FakePlayerData.getInstance().getProperName(target);
activeChar.sendPacket(new CreatureSay(activeChar.getObjectId(), type, "->" + name, text));
FakePlayerChatManager.getInstance().manageChat(activeChar, name, text);
}
else
{
activeChar.sendPacket(SystemMessageId.THAT_PERSON_IS_IN_MESSAGE_REFUSAL_MODE);
}
}
else
{
activeChar.sendPacket(SystemMessageId.THAT_PLAYER_IS_NOT_ONLINE);
}
return;
}
final L2PcInstance receiver = L2World.getInstance().getPlayer(target);
if ((receiver != null) && !receiver.isSilenceMode(activeChar.getObjectId()))

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<list enabled="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../xsd/spawns.xsd">
<spawn name="FakePlayers">
<npc id="80000" x="83485" y="147998" z="-3407" heading="23509" respawnDelay="60" /> <!-- Evi -->
</spawn>
</list>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/npcs.xsd">
<!-- Duelist -->
<npc id="81001" level="85" type="L2Monster" name="Gladus" title="Duelist" >
<race>HUMAN</race>
<sex>MALE</sex>
<stats str="88" int="39" dex="55" wit="39" con="82" men="38">
<vitals hp="22228" hpRegen="10.8" mp="3681" mpRegen="3.0" />
<attack physical="4425" magical="1284" random="30" critical="94" accuracy="206" attackSpeed="517" type="SWORD" range="40" distance="80" width="120" />
<defence physical="3613" magical="2307" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="82" />
<run ground="132" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" attackable="true" />
<ai type="FIGHTER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clanList>
<clan>FAKE_PLAYER</clan>
</clanList>
</ai>
<collision>
<radius normal="9" />
<height normal="23" />
</collision>
<parameters>
<skill name="Skill01_ID" id="261" level="22" />
<skill name="Skill02_ID" id="1" level="37" />
<skill name="Skill03_ID" id="6" level="37" />
<skill name="Skill04_ID" id="8" level="8" />
</parameters>
<skillList>
<skill id="261" level="22" /> <!-- Triple Sonic Slash -->
<skill id="1" level="37" /> <!-- Triple Slash -->
<skill id="6" level="37" /> <!-- Sonic Blaster -->
<skill id="8" level="8" /> <!-- Sonic Focus -->
</skillList>
</npc>
</list>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/npcs.xsd">
<!-- Spectral Dancer -->
<npc id="80000" level="78" type="L2Npc" name="Evi" >
<race>DARK_ELF</race>
<sex>FEMALE</sex>
<stats str="103" int="40" dex="53" wit="37" con="84" men="39">
<vitals hp="18857" hpRegen="10.8" mp="3863" mpRegen="3.0" />
<attack physical="10198" magical="1305" random="30" critical="132" accuracy="177" attackSpeed="588" type="FIST" range="40" distance="80" width="120" />
<defence physical="3388" magical="2450" />
<attribute>
<defence fire="200" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="85" />
<run ground="139" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" undying="true" attackable="false" />
<collision>
<radius normal="7.5" />
<height normal="24" />
</collision>
</npc>
</list>

View File

@@ -0,0 +1,20 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="fakePlayerChat" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="fpcName" use="required" />
<xs:attribute type="xs:string" name="searchMethod" use="required" />
<xs:attribute type="xs:string" name="searchText" use="required" />
<xs:attribute type="xs:string" name="answers" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -0,0 +1,45 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="fakePlayer" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:int" name="npcId"/>
<xs:attribute type="xs:short" name="classId"/>
<xs:attribute type="xs:byte" name="hair"/>
<xs:attribute type="xs:byte" name="hairColor"/>
<xs:attribute type="xs:byte" name="face"/>
<xs:attribute type="xs:string" name="nameColor"/>
<xs:attribute type="xs:string" name="titleColor"/>
<xs:attribute type="xs:int" name="equipHead"/>
<xs:attribute type="xs:int" name="equipLHand"/>
<xs:attribute type="xs:int" name="equipRHand"/>
<xs:attribute type="xs:int" name="equipGloves"/>
<xs:attribute type="xs:int" name="equipChest"/>
<xs:attribute type="xs:int" name="equipLegs"/>
<xs:attribute type="xs:int" name="equipFeet"/>
<xs:attribute type="xs:int" name="equipCloak"/>
<xs:attribute type="xs:int" name="equipHair"/>
<xs:attribute type="xs:int" name="equipHair2"/>
<xs:attribute type="xs:int" name="agathionId"/>
<xs:attribute type="xs:byte" name="weaponEnchantLevel"/>
<xs:attribute type="xs:byte" name="armorEnchantLevel"/>
<xs:attribute type="xs:boolean" name="fishing"/>
<xs:attribute type="xs:int" name="baitLocationX"/>
<xs:attribute type="xs:int" name="baitLocationY"/>
<xs:attribute type="xs:int" name="baitLocationZ"/>
<xs:attribute type="xs:byte" name="recommends"/>
<xs:attribute type="xs:byte" name="nobleLevel"/>
<xs:attribute type="xs:boolean" name="hero"/>
<xs:attribute type="xs:long" name="clanId"/>
<xs:attribute type="xs:byte" name="pledgeStatus"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -285,5 +285,7 @@
<xs:attribute name="passableDoor" type="xs:boolean" />
<xs:attribute name="hasSummoner" type="xs:boolean" />
<xs:attribute name="canBeSown" type="xs:boolean" />
<xs:attribute name="fakePlayer" type="xs:boolean" />
<xs:attribute name="fakePlayerTalkable" type="xs:boolean" />
</xs:complexType>
</xs:schema>