Addition of fake player system.

This commit is contained in:
MobiusDev
2017-11-26 02:33:09 +00:00
parent fffb78c071
commit 749b2775a8
339 changed files with 12524 additions and 717 deletions

View File

@@ -392,6 +392,9 @@
<!-- ADMIN MESSAGES -->
<admin command="admin_msg" accessLevel="100" />
<!-- ADMIN FAKE PLAYERS -->
<admin command="admin_fakechat" accessLevel="100" />
<!-- ADMIN MOB GROUP -->
<admin command="admin_mobmenu" accessLevel="100" />
<admin command="admin_mobgroup_list" accessLevel="100" />

View File

@@ -0,0 +1,33 @@
# ---------------------------------------------------------------------------
# Fake players
# ---------------------------------------------------------------------------
# Enable fake players.
EnableFakePlayers = False
# Enable chatting with fake players.
FakePlayerChat = True
# Enable shots usage for fake players.
FakePlayerUseShots = True
# Reward PvP kills by killing fake players.
FakePlayerKillsRewardPvP = True
# Fake player kills apply karma rules.
FakePlayerUnflaggedKillsKarma = True
# Aggressive AI fake players attack nearby monsters.
FakePlayerAggroMonsters = True
# Aggressive AI fake players attack nearby players.
FakePlayerAggroPlayers = False
# Aggressive AI fake players attack nearby fake players.
FakePlayerAggroFPC = False
# Fake players can drop items when killing monsters.
FakePlayerCanDropItems = True
# Fake players can pickup dropped items.
FakePlayerCanPickup = True

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,37 @@
<?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 -->
<!--
####################################### Hero Weapons #####################################################
Bow(37874) Crossbow(37875) Dagger(37868) Dual Blunt Weapon(37881) Dual Dagger(37880) Dual Sword(37879)
Fist(37872) OneHand Blunt(37871) OneHand Magic Blunt(37877) One Hand Magic Sword(37876) One Hand Sword(37869)
Spear(37873) Two-handed Magic Blunt Weapon(37878) Two-handed Sword(37870) Shield(37870) Sigil(37223)
#############################################################################################################
-->
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/FakePlayerVisualData.xsd">
<!-- Non-Combat -->
<fakePlayer npcId="80000" classId="188" hair="1" hairColor="1" face="0" equipRHand="17294" equipHead="37215" equipGloves="37216" equipChest="37213" equipLegs="37214" equipFeet="37217" equipCloak="40200" />
<!-- Combat -->
<!-- Sigel Phoenix Knight -->
<fakePlayer npcId="81001" classId="148" hair="0" hairColor="0" face="0" equipRHand="37869" equipLHand="37212" equipHead="37209" equipGloves="37210" equipChest="37207" equipLegs="37208" equipFeet="37211" equipCloak="30310" />
<!-- Tyrr Titan -->
<fakePlayer npcId="81002" classId="154" hair="0" hairColor="0" face="0" equipRHand="37870" equipHead="37215" equipGloves="37216" equipChest="37213" equipLegs="37214" equipFeet="37217" equipCloak="30311" />
<!-- Othell Fortune Seeker -->
<fakePlayer npcId="81003" classId="161" hair="0" hairColor="0" face="0" equipRHand="37880" equipHead="37215" equipGloves="37216" equipChest="37213" equipLegs="37214" equipFeet="37217" equipCloak="30312" />
<!-- Yul Trickster -->
<fakePlayer npcId="81004" classId="165" hair="0" hairColor="0" face="0" equipRHand="37875" equipHead="37215" equipGloves="37216" equipChest="37213" equipLegs="37214" equipFeet="37217" equipCloak="30313" />
<!-- Feoh Archmage -->
<fakePlayer npcId="81005" classId="166" hair="0" hairColor="0" face="0" equipRHand="37878" equipHead="37220" equipGloves="37221" equipChest="37218" equipLegs="37219" equipFeet="37222" equipCloak="30314" />
<!-- Iss Spectral Dancer -->
<fakePlayer npcId="81006" classId="173" hair="0" hairColor="0" face="0" equipRHand="37879" equipHead="37209" equipGloves="37210" equipChest="37207" equipLegs="37208" equipFeet="37211" equipCloak="30316" />
<!-- Aeore Eva's Saint -->
<fakePlayer npcId="81007" classId="180" hair="0" hairColor="0" face="0" equipRHand="37876" equipLHand="37223" equipHead="37220" equipGloves="37221" equipChest="37218" equipLegs="37219" equipFeet="37222" equipCloak="30317" />
<!-- Eviscerator -->
<fakePlayer npcId="81008" classId="188" hair="0" hairColor="0" face="0" equipRHand="37872" equipHead="37215" equipGloves="37216" equipChest="37213" equipLegs="37214" equipFeet="37217" equipCloak="40200" />
<!-- Sayha's Seer -->
<fakePlayer npcId="81009" classId="189" hair="0" hairColor="0" face="0" equipRHand="37878" equipHead="37220" equipGloves="37221" equipChest="37218" equipLegs="37219" equipFeet="37222" equipCloak="40201" />
</list>

View File

@@ -2402,4 +2402,45 @@
<point X="42630" Y="-48231" Z="-792" delay="0" run="true" />
<point X="45069" Y="-48034" Z="-792" delay="0" run="true" />
</route>
<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="83575" Y="147722" Z="-3405" delay="32" run="true" /> <!-- Buffer -->
<point X="82117" Y="147642" Z="-3469" delay="0" run="true" />
<point X="82152" Y="147580" Z="-3469" delay="36" run="true" /> <!-- Olympiad Statue-->
<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="83216" Y="146672" Z="-3465" delay="28" run="true" /> <!-- Warehouse -->
<point X="83211" Y="146724" Z="-3467" 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="80424" Y="145487" Z="-3533" delay="28" run="true" /> <!-- Auctioneer -->
<point X="80283" Y="145826" Z="-3533" delay="0" run="true" />
<point X="79952" Y="145840" Z="-3496" 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="81073" Y="145935" Z="-3533" delay="6" run="true" /> <!-- Pochi -->
<point X="81068" Y="145845" Z="-3533" delay="36" run="true" /> <!-- Pet Manager -->
<point X="81061" Y="145563" Z="-3533" delay="0" run="true" />
<point X="81563" Y="145532" Z="-3533" delay="3" run="true" />
<point X="81692" Y="147231" Z="-3533" delay="32" run="true" /> <!-- Kiki -->
<point X="81370" Y="147213" Z="-3533" delay="64" run="true" /> <!-- Plani -->
<point X="81517" Y="147231" Z="-3533" delay="1" run="true" />
<point X="81542" Y="147570" Z="-3469" delay="0" run="true" />
<point X="81109" Y="147770" Z="-3469" delay="99" run="true" /> <!-- Moe -->
<point X="81108" Y="149415" Z="-3469" delay="99" run="true" /> <!-- Auction House -->
<point X="81413" Y="149700" Z="-3469" delay="52" run="true" /> <!-- Clan Hall Managers -->
<point X="81718" Y="149626" Z="-3469" delay="60" run="true" /> <!-- Beauty Shop -->
<point X="82815" Y="148840" Z="-3469" delay="3" run="true" />
<point X="83482" Y="149278" Z="-3405" delay="16" run="true" /> <!-- Kekropus -->
<point X="83307" Y="148431" Z="-3405" delay="21" run="true" /> <!-- Training Camp Manager -->
</route>
</routes>

View File

@@ -88,7 +88,7 @@ public final class Wisp extends AbstractNpcAI
final L2Character creature = event.getSeen();
final L2Npc npc = (L2Npc) event.getSeer();
if (creature.isPlayer())
if (creature.isPlayer() || creature.isFakePlayer())
{
npc.setTarget(creature);
npc.doCast(npc.getId() == WISP ? WISP_HEAL.getSkill() : LARGE_WISP_HEAL.getSkill());

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

@@ -0,0 +1,115 @@
/*
* 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.commons.util.CommonUtil;
import com.l2jmobius.gameserver.data.xml.impl.FakePlayerData;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.base.ClassId;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.skills.SkillCaster;
import ai.AbstractNpcAI;
/**
* Town Fake Player walkers that receive buffs from Adventurer NPC.
* @author Mobius
*/
public class RecieveAdventurerBuffs extends AbstractNpcAI
{
// NPCs
private static final int[] ADVENTURERS_GUIDE =
{
32327,
33950,
};
private static final int[] FAKE_PLAYER_IDS =
{
80000
};
// Skills
// private static final SkillHolder KNIGHT = new SkillHolder(15648, 1); // Knight's Harmony (Adventurer)
private static final SkillHolder WARRIOR = new SkillHolder(15649, 1); // Warrior's Harmony (Adventurer)
private static final SkillHolder WIZARD = new SkillHolder(15650, 1); // Wizard's Harmony (Adventurer)
private static final SkillHolder[] GROUP_BUFFS =
{
new SkillHolder(15642, 1), // Horn Melody (Adventurer)
new SkillHolder(15643, 1), // Drum Melody (Adventurer)
new SkillHolder(15644, 1), // Pipe Organ Melody (Adventurer)
new SkillHolder(15645, 1), // Guitar Melody (Adventurer)
new SkillHolder(15646, 1), // Harp Melody (Adventurer)
new SkillHolder(15647, 1), // Lute Melody (Adventurer)
new SkillHolder(15651, 1), // Prevailing Sonata (Adventurer)
new SkillHolder(15652, 1), // Daring Sonata (Adventurer)
new SkillHolder(15653, 1), // Refreshing Sonata (Adventurer)
};
private RecieveAdventurerBuffs()
{
if (Config.FAKE_PLAYERS_ENABLED)
{
addSpawnId(FAKE_PLAYER_IDS);
}
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (event.startsWith("AUTOBUFF") && (npc != null) && !npc.isDead())
{
if (!npc.isMoving())
{
for (L2Npc nearby : L2World.getInstance().getVisibleObjects(npc, L2Npc.class, 100))
{
if (CommonUtil.contains(ADVENTURERS_GUIDE, nearby.getId()))
{
for (SkillHolder holder : GROUP_BUFFS)
{
SkillCaster.triggerCast(nearby, npc, holder.getSkill());
}
if (ClassId.getClassId(FakePlayerData.getInstance().getInfo(npc.getId()).getClassId()).isMage())
{
SkillCaster.triggerCast(nearby, npc, WIZARD.getSkill());
}
else
{
SkillCaster.triggerCast(nearby, npc, WARRIOR.getSkill());
}
break;
}
}
}
startQuestTimer("AUTOBUFF" + npc.getObjectId(), 30000, npc, null);
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onSpawn(L2Npc npc)
{
startQuestTimer("AUTOBUFF" + npc.getObjectId(), 1000, npc, null);
return super.onSpawn(npc);
}
public static void main(String[] args)
{
new RecieveAdventurerBuffs();
}
}

View File

@@ -79,6 +79,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.AdminGeodata;
@@ -410,6 +411,7 @@ public class MasterHandler
AdminEventEngine.class,
AdminEvents.class,
AdminExpSp.class,
AdminFakePlayers.class,
AdminFightCalculator.class,
AdminFortSiege.class,
AdminGeodata.class,

View File

@@ -192,7 +192,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,77 @@
/*
* 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);
}
return true;
}
@Override
public String[] getAdminCommandList()
{
return ADMIN_COMMANDS;
}
}

View File

@@ -31,6 +31,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.FishingData;
import com.l2jmobius.gameserver.data.xml.impl.ItemCrystalizationData;
import com.l2jmobius.gameserver.data.xml.impl.MultisellData;
@@ -44,9 +45,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;
@@ -294,6 +298,25 @@ public class AdminReload implements IAdminCommandHandler
AdminData.getInstance().broadcastMessageToGMs(activeChar.getName() + ": Reloaded Fishing 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

@@ -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;
@@ -59,6 +61,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, null, "->" + name, type, 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

@@ -40,5 +40,4 @@ public class PlayerLevelCondition implements ICondition
{
return creature.isPlayer() && (creature.getLevel() >= _minLevel) && (creature.getLevel() < _maxLevel);
}
}

View File

@@ -16,9 +16,11 @@
*/
package handlers.playeractions;
import com.l2jmobius.gameserver.ThreadPoolManager;
import com.l2jmobius.gameserver.ai.CtrlEvent;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.ai.NextAction;
import com.l2jmobius.gameserver.data.xml.impl.FakePlayerData;
import com.l2jmobius.gameserver.handler.IPlayerActionHandler;
import com.l2jmobius.gameserver.model.ActionDataHolder;
import com.l2jmobius.gameserver.model.L2Object;
@@ -97,6 +99,15 @@ public final class SocialAction implements IPlayerActionHandler
return true;
}
private void scheduleDeny(L2PcInstance player)
{
if (player != null)
{
player.sendPacket(SystemMessageId.THE_COUPLE_ACTION_WAS_DENIED);
player.onTransactionResponse();
}
}
private void useCoupleSocial(L2PcInstance player, int id)
{
if (player == null)
@@ -105,7 +116,26 @@ public final class SocialAction implements IPlayerActionHandler
}
final L2Object target = player.getTarget();
if ((target == null) || !target.isPlayer())
if ((target == null))
{
player.sendPacket(SystemMessageId.INVALID_TARGET);
return;
}
if (FakePlayerData.getInstance().isTalkable(target.getName()))
{
final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_REQUESTED_A_COUPLE_ACTION_WITH_C1);
sm.addString(target.getName());
player.sendPacket(sm);
if (!player.isProcessingRequest())
{
ThreadPoolManager.schedule(() -> scheduleDeny(player), 10000);
player.blockRequest();
}
return;
}
if (!target.isPlayer())
{
player.sendPacket(SystemMessageId.INVALID_TARGET);
return;

View File

@@ -216,11 +216,14 @@ public class Q10766_ANewCraft extends Quest
@Id(WINDY_HEALING_POTION_1)
public void onItemCreate(OnItemCreate event)
{
final L2PcInstance player = event.getActiveChar();
final QuestState qs = getQuestState(player, false);
if ((qs != null) && (qs.isCond(3)) && (getQuestItemsCount(qs.getPlayer(), AIR_STONE) >= 1) && (getQuestItemsCount(qs.getPlayer(), WINDY_HEALING_POTION_1) >= 1))
final L2PcInstance player = event.getActiveChar().getActingPlayer();
if (player != null)
{
qs.setCond(4, true);
final QuestState qs = getQuestState(player, false);
if ((qs != null) && (qs.isCond(3)) && (getQuestItemsCount(qs.getPlayer(), AIR_STONE) >= 1) && (getQuestItemsCount(qs.getPlayer(), WINDY_HEALING_POTION_1) >= 1))
{
qs.setCond(4, true);
}
}
}
}

View File

@@ -141,11 +141,14 @@ public class Q10767_AWholeNewLevelOfAlchemy extends Quest
@Id(HIGH_GRADE_LOVE_POTION)
public void onItemCreate(OnItemCreate event)
{
final L2PcInstance player = event.getActiveChar();
final QuestState qs = getQuestState(player, false);
if ((qs != null) && (qs.isCond(1)) && (getQuestItemsCount(qs.getPlayer(), SUPERIOR_WINDY_HEALING_POTION) >= 1000) && (getQuestItemsCount(qs.getPlayer(), SUPERIOR_WINDY_QUIK_HEALING_POTION) >= 1000) && (getQuestItemsCount(qs.getPlayer(), HIGH_GRADE_LOVE_POTION) >= 1000))
final L2PcInstance player = event.getActiveChar().getActingPlayer();
if (player != null)
{
qs.setCond(2, true);
final QuestState qs = getQuestState(player, false);
if ((qs != null) && (qs.isCond(1)) && (getQuestItemsCount(qs.getPlayer(), SUPERIOR_WINDY_HEALING_POTION) >= 1000) && (getQuestItemsCount(qs.getPlayer(), SUPERIOR_WINDY_QUIK_HEALING_POTION) >= 1000) && (getQuestItemsCount(qs.getPlayer(), HIGH_GRADE_LOVE_POTION) >= 1000))
{
qs.setCond(2, true);
}
}
}
}

View File

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

View File

@@ -0,0 +1,341 @@
<?xml version="1.0" encoding="UTF-8"?>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../xsd/npcs.xsd">
<!-- Sigel Phoenix Knight -->
<npc id="81001" level="94" type="L2Monster" name="Siegfield" title="Sigel Phoenix Knight" >
<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" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="FIGHTER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="9" />
<height normal="23" />
</collision>
<parameters>
<skill name="Skill01_ID" id="10009" level="6" />
<skill name="Skill02_ID" id="10010" level="6" />
<skill name="Skill03_ID" id="10011" level="4" />
<skill name="Skill04_ID" id="10012" level="4" />
</parameters>
<skill_list>
<skill id="10009" level="6" /> <!-- Last Judgment -->
<skill id="10010" level="6" /> <!-- Justice Punishment -->
<skill id="10011" level="4" /> <!-- Shield Impact -->
<skill id="10012" level="4" /> <!-- Shield Wave -->
</skill_list>
</npc>
<!-- Tyrr Titan -->
<npc id="81002" level="94" type="L2Monster" name="Tyrrion" title="Tyrr Titan" >
<race>ORC</race>
<sex>MALE</sex>
<stats str="88" int="37" dex="50" wit="38" con="87" men="41">
<vitals hp="19416" hpRegen="10.8" mp="3727" mpRegen="3.0" />
<attack physical="11025" magical="1247" random="30" critical="92" accuracy="168" attackSpeed="540" type="SWORD" range="40" distance="80" width="120" />
<defence physical="3429" magical="2046" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="70" />
<run ground="130" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="FIGHTER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="7" />
<height normal="27" />
</collision>
<parameters>
<skill name="Skill01_ID" id="10267" level="4" />
<skill name="Skill02_ID" id="1760" level="5" />
</parameters>
<skill_list>
<skill id="10267" level="4" /> <!-- Hurricane Rush -->
<skill id="1760" level="5" /> <!-- Armor Destruction -->
</skill_list>
</npc>
<!-- Othell Fortune Seeker -->
<npc id="81003" level="94" type="L2Monster" name="Othelo" title="Othell Fortune Seeker" >
<race>DWARF</race>
<sex>FEMALE</sex>
<stats str="87" int="39" dex="53" wit="37" con="85" men="40">
<vitals hp="17018" hpRegen="10.8" mp="3693" mpRegen="3.0" />
<attack physical="4807" magical="1281" random="30" critical="230" accuracy="165" attackSpeed="943" type="SWORD" range="40" distance="80" width="120" />
<defence physical="2889" magical="2035" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="80" />
<run ground="131" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="FIGHTER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="5" />
<height normal="19" />
</collision>
<parameters>
<skill name="Skill01_ID" id="10508" level="6" />
<skill name="Skill02_ID" id="10509" level="6" />
<skill name="Skill03_ID" id="10510" level="5" />
</parameters>
<skill_list>
<skill id="10508" level="6" /> <!-- Blood Stab -->
<skill id="10509" level="6" /> <!-- Heart Breaker -->
<skill id="10510" level="5" /> <!-- Chain Blow -->
</skill_list>
</npc>
<!-- Yul Trickster -->
<npc id="81004" level="94" type="L2Monster" name="Yully" title="Yul Trickster" >
<race>KAMAEL</race>
<sex>FEMALE</sex>
<stats str="88" int="43" dex="57" wit="36" con="80" men="37">
<vitals hp="15285" hpRegen="10.8" mp="4596" mpRegen="3.0" />
<attack physical="9754" magical="1375" random="30" critical="185" accuracy="167" attackSpeed="483" reuseDelay="1500" type="BOW" range="500" distance="80" width="120" />
<defence physical="2885" magical="2318" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="87" />
<run ground="140" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="ARCHER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="7" />
<height normal="22.6" />
</collision>
<parameters>
<skill name="Skill01_ID" id="10760" level="6" />
<skill name="Skill02_ID" id="10762" level="5" />
<skill name="Skill03_ID" id="10763" level="6" />
</parameters>
<skill_list>
<skill id="10760" level="6" /> <!-- Tornado Shot -->
<skill id="10762" level="5" /> <!-- Quick Shot -->
<skill id="10763" level="6" /> <!-- Pin Point -->
</skill_list>
</npc>
<!-- Feoh Archmage -->
<npc id="81005" level="94" type="L2Monster" name="Feoth" title="Feoh Archmage" >
<race>HUMAN</race>
<sex>FEMALE</sex>
<stats str="38" int="79" dex="27" wit="78" con="41" men="78">
<vitals hp="14435" hpRegen="10.8" mp="9103" mpRegen="3.0" />
<attack physical="1257" magical="10320" random="30" critical="61" accuracy="158" attackSpeed="336" type="BLUNT" range="40" distance="500" width="120" />
<defence physical="3132" magical="2635" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="78" />
<run ground="124" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="MAGE" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="8" />
<height normal="23.5" />
</collision>
<parameters>
<skill name="Skill01_ID" id="11011" level="6" />
<skill name="Skill02_ID" id="11017" level="6" />
<skill name="Skill03_ID" id="11024" level="5" />
<skill name="Skill04_ID" id="11047" level="4" />
</parameters>
<skill_list>
<skill id="11011" level="6" /> <!-- Elemental Spike -->
<skill id="11017" level="6" /> <!-- Elemental Crash -->
<skill id="11024" level="5" /> <!-- Volcanic Destruction -->
<skill id="11047" level="4" /> <!-- Ruin -->
</skill_list>
</npc>
<!-- Iss Spectral Dancer -->
<npc id="81006" level="94" type="L2Monster" name="Isda" title="Iss Spectral Dancer" >
<race>DARK_ELF</race>
<sex>FEMALE</sex>
<stats str="92" int="42" dex="56" wit="39" con="77" men="35">
<vitals hp="15499" hpRegen="10.8" mp="4038" mpRegen="3.0" />
<attack physical="8777" magical="1451" random="30" critical="95" accuracy="162" attackSpeed="582" type="SWORD" range="40" distance="80" width="120" />
<defence physical="3429" magical="2026" />
<attribute>
<defence fire="250" 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" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="BALANCED" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="7" />
<height normal="23.5" />
</collision>
<parameters>
<skill name="Skill01_ID" id="11508" level="4" />
<skill name="Skill02_ID" id="11509" level="6" />
<skill name="Skill02_ID" id="11510" level="5" />
</parameters>
<skill_list>
<skill id="11508" level="4" /> <!-- Assault Rush -->
<skill id="11509" level="6" /> <!-- Crippling Attack -->
<skill id="11510" level="5" /> <!-- Shadow Blade -->
</skill_list>
</npc>
<!-- Aeore Eva's Saint -->
<npc id="81007" level="94" type="L2Monster" name="Aorta" title="Aeore Eva's Saint" >
<race>ELF</race>
<sex>FEMALE</sex>
<stats str="36" int="74" dex="32" wit="84" con="38" men="77">
<vitals hp="13651" hpRegen="10.8" mp="11193" mpRegen="3.0" />
<attack physical="1008" magical="7469" random="30" critical="63" accuracy="161" attackSpeed="400" type="SWORD" range="40" distance="80" width="120" />
<defence physical="2406" magical="2627" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="85" />
<run ground="129" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="HEALER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="7.5" />
<height normal="23" />
</collision>
<parameters>
<skill name="Skill01_ID" id="11766" level="6" />
<skill name="Skill02_ID" id="11814" level="6" />
</parameters>
<skill_list>
<skill id="11766" level="6" /> <!-- Dark Blast -->
<skill id="11814" level="6" /> <!-- Dark Force -->
</skill_list>
</npc>
<!-- Eviscerator -->
<npc id="81008" level="94" type="L2Monster" name="Breezer" title="Eviscerator" >
<race>ERTHEIA</race>
<sex>FEMALE</sex>
<stats str="89" int="40" dex="52" 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="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="88" />
<run ground="141" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="FIGHTER" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="6.5" />
<height normal="19.2" />
</collision>
<parameters>
<skill name="Skill01_ID" id="30500" level="18" />
<skill name="Skill02_ID" id="30504" level="6" />
</parameters>
<skill_list>
<skill id="30500" level="18" /> <!-- Lateral Hit -->
<skill id="30504" level="6" /> <!-- Gravity Hit -->
</skill_list>
</npc>
<!-- Sayha's Seer -->
<npc id="81009" level="94" type="L2Monster" name="Hoppy" title="Sayha's Seer" >
<race>ERTHEIA</race>
<sex>FEMALE</sex>
<stats str="37" int="79" dex="27" wit="76" con="42" men="80">
<vitals hp="18857" hpRegen="10.8" mp="3863" mpRegen="3.0" />
<attack physical="1242" magical="4784" random="30" critical="61" accuracy="177" attackSpeed="162" type="BLUNT" range="40" distance="80" width="120" />
<defence physical="3388" magical="2450" />
<attribute>
<defence fire="250" water="250" wind="250" earth="250" holy="250" dark="250" />
<attack type="WATER" value="330" />
</attribute>
<speed>
<walk ground="88" />
<run ground="141" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" attackable="true" />
<ai type="BALANCED" clanHelpRange="1000" aggroRange="1000" isAggressive="true" > <!-- FIGHTER, ARCHER, BALANCED, MAGE, HEALER -->
<clan_list>
<clan>FAKE_PLAYER</clan>
</clan_list>
</ai>
<collision>
<radius normal="6.5" />
<height normal="19.2" />
</collision>
<parameters>
<skill name="Skill01_ID" id="30001" level="22" /> <!-- Hydro Attack -->
<skill name="Skill02_ID" id="30019" level="5" /> <!-- Sayha's Word -->
</parameters>
<skill_list>
<skill id="30001" level="22" /> <!-- Hydro Attack -->
<skill id="30019" level="5" /> <!-- Sayha's Word -->
</skill_list>
</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">
<!-- Eviscerator -->
<npc id="80000" level="94" type="L2Npc" name="Evi" >
<race>ERTHEIA</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="88" />
<run ground="141" />
</speed>
</stats>
<status fakePlayer="true" talkable="false" randomAnimation="false" randomWalk="false" undying="true" attackable="false" />
<collision>
<radius normal="6.5" />
<height normal="19.2" />
</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

@@ -201,6 +201,8 @@
<xs:attribute name="hasSummoner" type="xs:boolean" />
<xs:attribute name="canBeSown" type="xs:boolean" />
<xs:attribute name="isDeathPenalty" type="xs:boolean" />
<xs:attribute name="fakePlayer" type="xs:boolean" />
<xs:attribute name="fakePlayerTalkable" type="xs:boolean" />
</xs:complexType>
</xs:element>
<xs:element name="skill_list" minOccurs="0" maxOccurs="1">