mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-02 19:42:05 -04:00
NPCs now spawn and load template from the db.
This commit is contained in:
parent
02b90edd3f
commit
ea6b1e33c7
@ -7,14 +7,13 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFXIVClassic_Lobby_Server.common;
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara.npc;
|
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara;
|
|
||||||
using FFXIVClassic_Map_Server.utils;
|
using FFXIVClassic_Map_Server.utils;
|
||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
using FFXIVClassic_Map_Server.packets.send.player;
|
using FFXIVClassic_Map_Server.packets.send.player;
|
||||||
using FFXIVClassic_Lobby_Server.dataobjects;
|
using FFXIVClassic_Lobby_Server.dataobjects;
|
||||||
using FFXIVClassic_Map_Server;
|
using FFXIVClassic_Map_Server;
|
||||||
using FFXIVClassic_Map_Server.common.EfficientHashTables;
|
using FFXIVClassic_Map_Server.common.EfficientHashTables;
|
||||||
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
|
|
||||||
namespace FFXIVClassic_Lobby_Server
|
namespace FFXIVClassic_Lobby_Server
|
||||||
{
|
{
|
||||||
@ -458,6 +457,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||||||
conn.Dispose();
|
conn.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SubPacket getLatestAchievements(Player player)
|
public static SubPacket getLatestAchievements(Player player)
|
||||||
|
@ -30,12 +30,7 @@ using FFXIVClassic_Map_Server.packets.send.list;
|
|||||||
using FFXIVClassic_Map_Server.packets.receive.events;
|
using FFXIVClassic_Map_Server.packets.receive.events;
|
||||||
using FFXIVClassic_Map_Server.packets.send.events;
|
using FFXIVClassic_Map_Server.packets.send.events;
|
||||||
using FFXIVClassic_Map_Server.lua;
|
using FFXIVClassic_Map_Server.lua;
|
||||||
using FFXIVClassic_Map_Server.dataobjects.actors;
|
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara.npc;
|
|
||||||
using FFXIVClassic_Map_Server.actors;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using FFXIVClassic_Map_Server.actors.debug;
|
|
||||||
using FFXIVClassic_Map_Server.actors.world;
|
|
||||||
using FFXIVClassic_Map_Server.common.EfficientHashTables;
|
using FFXIVClassic_Map_Server.common.EfficientHashTables;
|
||||||
|
|
||||||
namespace FFXIVClassic_Lobby_Server
|
namespace FFXIVClassic_Lobby_Server
|
||||||
@ -200,8 +195,10 @@ namespace FFXIVClassic_Lobby_Server
|
|||||||
//Update Instance
|
//Update Instance
|
||||||
List<BasePacket> instanceUpdatePackets = player.updateInstance(player.getActor().zone.getActorsAroundActor(player.getActor(), 50));
|
List<BasePacket> instanceUpdatePackets = player.updateInstance(player.getActor().zone.getActorsAroundActor(player.getActor(), 50));
|
||||||
foreach (BasePacket bp in instanceUpdatePackets)
|
foreach (BasePacket bp in instanceUpdatePackets)
|
||||||
|
{
|
||||||
|
// bp.debugPrintPacket();
|
||||||
client.queuePacket(bp);
|
client.queuePacket(bp);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
//Set Target
|
//Set Target
|
||||||
case 0x00CD:
|
case 0x00CD:
|
||||||
|
@ -127,10 +127,6 @@ namespace FFXIVClassic_Lobby_Server
|
|||||||
{
|
{
|
||||||
server.testCodePacket(Utils.MurmurHash2(split[1], 0), Convert.ToUInt32(split[2], 16), split[3]);
|
server.testCodePacket(Utils.MurmurHash2(split[1], 0), Convert.ToUInt32(split[2], 16), split[3]);
|
||||||
}
|
}
|
||||||
else if (split[0].Equals("test"))
|
|
||||||
{
|
|
||||||
server.testCodePacket2(split[1], split[2]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,9 +12,9 @@ using FFXIVClassic_Lobby_Server.packets;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||||
using FFXIVClassic_Map_Server;
|
using FFXIVClassic_Map_Server;
|
||||||
using FFXIVClassic_Map_Server.actors;
|
|
||||||
using FFXIVClassic_Map_Server.packets.send;
|
using FFXIVClassic_Map_Server.packets.send;
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara;
|
using FFXIVClassic_Map_Server.dataobjects.chara;
|
||||||
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
|
|
||||||
namespace FFXIVClassic_Lobby_Server
|
namespace FFXIVClassic_Lobby_Server
|
||||||
{
|
{
|
||||||
@ -40,6 +40,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||||||
mWorldManager = new WorldManager(this);
|
mWorldManager = new WorldManager(this);
|
||||||
mWorldManager.LoadZoneList();
|
mWorldManager.LoadZoneList();
|
||||||
mWorldManager.LoadZoneEntranceList();
|
mWorldManager.LoadZoneEntranceList();
|
||||||
|
mWorldManager.LoadNPCs();
|
||||||
|
|
||||||
IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), FFXIV_MAP_PORT);
|
IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), FFXIV_MAP_PORT);
|
||||||
|
|
||||||
@ -253,22 +254,6 @@ namespace FFXIVClassic_Lobby_Server
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCodePacket2(string name, string target)
|
|
||||||
{
|
|
||||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
|
|
||||||
{
|
|
||||||
SetActorPropetyPacket changeProperty = new SetActorPropetyPacket(target);
|
|
||||||
changeProperty.addProperty(entry.Value.getActor(), name);
|
|
||||||
changeProperty.addProperty(entry.Value.getActor(), "charaWork.parameterSave.hpMax[0]");
|
|
||||||
changeProperty.setTarget(target);
|
|
||||||
|
|
||||||
SubPacket changePropertyPacket = changeProperty.buildPacket((entry.Value.actorID), (entry.Value.actorID));
|
|
||||||
BasePacket packet = BasePacket.createPacket(changePropertyPacket, true, false);
|
|
||||||
packet.debugPrintPacket();
|
|
||||||
entry.Value.queuePacket(packet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void doMusic(string music)
|
public void doMusic(string music)
|
||||||
{
|
{
|
||||||
ushort musicId;
|
ushort musicId;
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
using FFXIVClassic_Lobby_Server;
|
using FFXIVClassic_Lobby_Server;
|
||||||
using FFXIVClassic_Lobby_Server.common;
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
using FFXIVClassic_Map_Server.actors;
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
using FFXIVClassic_Map_Server.actors.debug;
|
|
||||||
using FFXIVClassic_Map_Server.actors.world;
|
|
||||||
using FFXIVClassic_Map_Server.common.EfficientHashTables;
|
using FFXIVClassic_Map_Server.common.EfficientHashTables;
|
||||||
using FFXIVClassic_Map_Server.dataobjects;
|
using FFXIVClassic_Map_Server.dataobjects;
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara;
|
using FFXIVClassic_Map_Server.dataobjects.chara;
|
||||||
@ -124,6 +122,61 @@ namespace FFXIVClassic_Map_Server
|
|||||||
Log.info(String.Format("Loaded {0} zone spawn locations.", count));
|
Log.info(String.Format("Loaded {0} zone spawn locations.", count));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void LoadNPCs()
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
string query = @"
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
zoneId,
|
||||||
|
actorTemplateId,
|
||||||
|
positionX,
|
||||||
|
positionY,
|
||||||
|
positionZ,
|
||||||
|
rotation,
|
||||||
|
actorState,
|
||||||
|
animationId,
|
||||||
|
actorClassName
|
||||||
|
FROM server_npclist
|
||||||
|
";
|
||||||
|
|
||||||
|
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||||
|
|
||||||
|
using (MySqlDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
Npc npc = new Npc(reader.GetUInt32(0), reader.GetString(1), reader.GetUInt32(2), reader.GetUInt32(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6), reader.GetFloat(7), reader.GetUInt16(8), reader.GetUInt32(9), reader.GetString(10));
|
||||||
|
|
||||||
|
Zone zone = zoneList[npc.zoneId];
|
||||||
|
if (zone == null)
|
||||||
|
continue;
|
||||||
|
npc.zone = zone;
|
||||||
|
zone.addActorToZone(npc);
|
||||||
|
count++;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{ Console.WriteLine(e); }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.info(String.Format("Loaded {0} npc(s).", count));
|
||||||
|
}
|
||||||
|
|
||||||
//Moves the actor to the new zone if exists. No packets are sent nor position changed.
|
//Moves the actor to the new zone if exists. No packets are sent nor position changed.
|
||||||
public void DoSeamlessZoneChange(Player player, uint destinationZoneId)
|
public void DoSeamlessZoneChange(Player player, uint destinationZoneId)
|
||||||
{
|
{
|
||||||
@ -235,6 +288,8 @@ namespace FFXIVClassic_Map_Server
|
|||||||
|
|
||||||
public Zone GetZone(uint zoneId)
|
public Zone GetZone(uint zoneId)
|
||||||
{
|
{
|
||||||
|
if (!zoneList.ContainsKey(zoneId))
|
||||||
|
return null;
|
||||||
return zoneList[zoneId];
|
return zoneList[zoneId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ using System.Linq;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Actor
|
class Actor
|
||||||
{
|
{
|
||||||
@ -121,6 +121,9 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
|||||||
public virtual BasePacket getInitPackets(uint playerActorId)
|
public virtual BasePacket getInitPackets(uint playerActorId)
|
||||||
{
|
{
|
||||||
SetActorPropetyPacket initProperties = new SetActorPropetyPacket("/_init");
|
SetActorPropetyPacket initProperties = new SetActorPropetyPacket("/_init");
|
||||||
|
initProperties.addByte(0xE14B0CA8, 1);
|
||||||
|
initProperties.addByte(0x2138FD71, 1);
|
||||||
|
initProperties.addByte(0xFBFBCFB1, 1);
|
||||||
initProperties.addTarget();
|
initProperties.addTarget();
|
||||||
return BasePacket.createPacket(initProperties.buildPacket(playerActorId, actorId), true, false);
|
return BasePacket.createPacket(initProperties.buildPacket(playerActorId, actorId), true, false);
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
using FFXIVClassic_Map_Server.actors.judge;
|
using FFXIVClassic_Map_Server.dataobjects;
|
||||||
using FFXIVClassic_Map_Server.dataobjects;
|
|
||||||
using FFXIVClassic_Map_Server.dataobjects.actors;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.actors
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class StaticActors
|
class StaticActors
|
||||||
{
|
{
|
||||||
|
@ -10,7 +10,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Zone : Actor
|
class Zone : Actor
|
||||||
{
|
{
|
||||||
@ -21,7 +21,7 @@ namespace FFXIVClassic_Map_Server
|
|||||||
public ushort bgmDay, bgmNight, bgmBattle;
|
public ushort bgmDay, bgmNight, bgmBattle;
|
||||||
|
|
||||||
public int boundingGridSize = 50;
|
public int boundingGridSize = 50;
|
||||||
public int minX = -100, minY = -100, maxX = 100, maxY = 100;
|
public int minX = -1000, minY = -1000, maxX = 1000, maxY = 1000;
|
||||||
private int numXBlocks, numYBlocks;
|
private int numXBlocks, numYBlocks;
|
||||||
private int halfWidth, halfHeight;
|
private int halfWidth, halfHeight;
|
||||||
|
|
||||||
@ -182,6 +182,8 @@ namespace FFXIVClassic_Map_Server
|
|||||||
|
|
||||||
public List<Actor> getActorsAroundPoint(float x, float y, int checkDistance)
|
public List<Actor> getActorsAroundPoint(float x, float y, int checkDistance)
|
||||||
{
|
{
|
||||||
|
checkDistance /= boundingGridSize;
|
||||||
|
|
||||||
int gridX = (int)x/boundingGridSize;
|
int gridX = (int)x/boundingGridSize;
|
||||||
int gridY = (int)y/boundingGridSize;
|
int gridY = (int)y/boundingGridSize;
|
||||||
|
|
||||||
@ -213,13 +215,23 @@ namespace FFXIVClassic_Map_Server
|
|||||||
|
|
||||||
public List<Actor> getActorsAroundActor(Actor actor, int checkDistance)
|
public List<Actor> getActorsAroundActor(Actor actor, int checkDistance)
|
||||||
{
|
{
|
||||||
|
checkDistance /= boundingGridSize;
|
||||||
|
|
||||||
int gridX = (int)actor.positionX / boundingGridSize;
|
int gridX = (int)actor.positionX / boundingGridSize;
|
||||||
int gridY = (int)actor.positionZ / boundingGridSize;
|
int gridY = (int)actor.positionZ / boundingGridSize;
|
||||||
|
|
||||||
gridX += halfWidth;
|
gridX += halfWidth;
|
||||||
gridY += halfHeight;
|
gridY += halfHeight;
|
||||||
|
|
||||||
|
//Boundries
|
||||||
|
if (gridX < 0)
|
||||||
|
gridX = 0;
|
||||||
|
if (gridX >= numXBlocks)
|
||||||
|
gridX = numXBlocks - 1;
|
||||||
|
if (gridY < 0)
|
||||||
|
gridY = 0;
|
||||||
|
if (gridY >= numYBlocks)
|
||||||
|
gridY = numYBlocks - 1;
|
||||||
|
|
||||||
List<Actor> result = new List<Actor>();
|
List<Actor> result = new List<Actor>();
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class AetheryteWork
|
class AetheryteWork
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class BattleSave
|
class BattleSave
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class BattleTemp
|
class BattleTemp
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class CharaWork
|
class CharaWork
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
using FFXIVClassic_Map_Server.actors.chara;
|
using FFXIVClassic_Map_Server.Actors.Chara;
|
||||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -7,7 +7,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Character:Actor
|
class Character:Actor
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class EventSave
|
class EventSave
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class EventTemp
|
class EventTemp
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class ParameterSave
|
class ParameterSave
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class ParameterTemp
|
class ParameterTemp
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.actors.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class Work
|
class Work
|
||||||
{
|
{
|
||||||
|
@ -3,43 +3,56 @@ using FFXIVClassic_Lobby_Server.common;
|
|||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
using FFXIVClassic_Map_Server.lua;
|
using FFXIVClassic_Map_Server.lua;
|
||||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||||
|
using FFXIVClassic_Map_Server.utils;
|
||||||
|
using MySql.Data.MySqlClient;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara.npc
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Npc : Character
|
class Npc : Character
|
||||||
{
|
{
|
||||||
public Npc(uint id, string actorName, uint displayNameId, string customDisplayName, float positionX, float positionY, float positionZ, float rotation, uint animationId, string className, byte[] initParams)
|
public Npc(uint id, string actorName, uint zoneId, uint actorTemplateId, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string className)
|
||||||
: base(id)
|
: base(id)
|
||||||
{
|
{
|
||||||
this.actorName = actorName;
|
this.actorName = actorName;
|
||||||
this.displayNameId = displayNameId;
|
this.positionX = posX;
|
||||||
this.customDisplayName = customDisplayName;
|
this.positionY = posY;
|
||||||
this.positionX = positionX;
|
this.positionZ = posZ;
|
||||||
this.positionY = positionY;
|
this.rotation = rot;
|
||||||
this.positionZ = positionZ;
|
|
||||||
this.rotation = rotation;
|
|
||||||
this.animationId = animationId;
|
this.animationId = animationId;
|
||||||
this.className = className;
|
this.className = className;
|
||||||
|
|
||||||
if (initParams.Length != 0)
|
this.displayNameId = displayNameId;
|
||||||
this.classParams = LuaUtils.readLuaParams(initParams);
|
this.customDisplayName = customDisplayName;
|
||||||
|
|
||||||
|
this.zoneId = zoneId;
|
||||||
|
|
||||||
|
loadNpcTemplate(actorTemplateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override BasePacket getInitPackets(uint playerActorId)
|
public SubPacket createAddActorPacket(uint playerActorId)
|
||||||
|
{
|
||||||
|
return AddActorPacket.buildPacket(actorId, playerActorId, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override SubPacket createScriptBindPacket(uint playerActorId)
|
||||||
|
{
|
||||||
|
List<LuaParam> lParams = LuaUtils.createLuaParamList("/Chara/Npc/Populace/PopulaceStandard", false, false, false, false, false, 0xF47F6, false, false, 0, 1, "TEST");
|
||||||
|
return ActorInstantiatePacket.buildPacket(actorId, playerActorId, actorName, className, lParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override BasePacket getSpawnPackets(uint playerActorId, uint spawnType)
|
||||||
{
|
{
|
||||||
List<SubPacket> subpackets = new List<SubPacket>();
|
List<SubPacket> subpackets = new List<SubPacket>();
|
||||||
subpackets.Add(createAddActorPacket(playerActorId));
|
subpackets.Add(createAddActorPacket(playerActorId));
|
||||||
subpackets.Add(createSpeedPacket(playerActorId));
|
subpackets.Add(createSpeedPacket(playerActorId));
|
||||||
subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
|
subpackets.Add(createSpawnPositonPacket(playerActorId, 0x0));
|
||||||
subpackets.Add(createAppearancePacket(playerActorId));
|
subpackets.Add(createAppearancePacket(playerActorId));
|
||||||
subpackets.Add(createNamePacket(playerActorId));
|
subpackets.Add(createNamePacket(playerActorId));
|
||||||
subpackets.Add(_0xFPacket.buildPacket(playerActorId, playerActorId));
|
|
||||||
subpackets.Add(createStatePacket(playerActorId));
|
subpackets.Add(createStatePacket(playerActorId));
|
||||||
subpackets.Add(createIdleAnimationPacket(playerActorId));
|
subpackets.Add(createIdleAnimationPacket(playerActorId));
|
||||||
subpackets.Add(createInitStatusPacket(playerActorId));
|
subpackets.Add(createInitStatusPacket(playerActorId));
|
||||||
@ -50,5 +63,112 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara.npc
|
|||||||
return BasePacket.createPacket(subpackets, true, false);
|
return BasePacket.createPacket(subpackets, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void loadNpcTemplate(uint id)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
string query = @"
|
||||||
|
SELECT
|
||||||
|
displayNameId,
|
||||||
|
customDisplayName,
|
||||||
|
base,
|
||||||
|
size,
|
||||||
|
hairStyle,
|
||||||
|
hairHighlightColor,
|
||||||
|
hairVariation,
|
||||||
|
faceType,
|
||||||
|
characteristics,
|
||||||
|
characteristicsColor,
|
||||||
|
faceEyebrows,
|
||||||
|
faceIrisSize,
|
||||||
|
faceEyeShape,
|
||||||
|
faceNose,
|
||||||
|
faceFeatures,
|
||||||
|
faceMouth,
|
||||||
|
ears,
|
||||||
|
hairColor,
|
||||||
|
skinColor,
|
||||||
|
eyeColor,
|
||||||
|
voice,
|
||||||
|
mainHand,
|
||||||
|
offHand,
|
||||||
|
spMainHand,
|
||||||
|
spOffHand,
|
||||||
|
throwing,
|
||||||
|
pack,
|
||||||
|
pouch,
|
||||||
|
head,
|
||||||
|
body,
|
||||||
|
legs,
|
||||||
|
hands,
|
||||||
|
feet,
|
||||||
|
waist,
|
||||||
|
neck,
|
||||||
|
leftEars,
|
||||||
|
rightEars,
|
||||||
|
leftIndex,
|
||||||
|
rightIndex,
|
||||||
|
leftFinger,
|
||||||
|
rightFinger
|
||||||
|
FROM gamedata_actor_templates
|
||||||
|
INNER JOIN gamedata_actor_appearance ON gamedata_actor_templates.id = gamedata_actor_appearance.id
|
||||||
|
WHERE gamedata_actor_templates.id = @templateId
|
||||||
|
";
|
||||||
|
|
||||||
|
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||||
|
cmd.Parameters.AddWithValue("@templateId", id);
|
||||||
|
|
||||||
|
using (MySqlDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
|
||||||
|
//Handle Name
|
||||||
|
|
||||||
|
if (reader.IsDBNull(1))
|
||||||
|
displayNameId = reader.GetUInt32(0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
customDisplayName = reader.GetString(1);
|
||||||
|
displayNameId = 0xFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Handle Appearance
|
||||||
|
modelId = reader.GetUInt32(2);
|
||||||
|
appearanceIds[Character.SIZE] = reader.GetUInt32(3);
|
||||||
|
appearanceIds[Character.COLORINFO] = (uint)(reader.GetUInt32(18) | (reader.GetUInt32(17) << 10) | (reader.GetUInt32(19) << 20)); //17 - Skin Color, 16 - Hair Color, 18 - Eye Color
|
||||||
|
appearanceIds[Character.FACEINFO] = PrimitiveConversion.ToUInt32(CharacterUtils.getFaceInfo(reader.GetByte(8), reader.GetByte(9), reader.GetByte(7), reader.GetByte(16), reader.GetByte(15), reader.GetByte(14), reader.GetByte(13), reader.GetByte(12), reader.GetByte(11), reader.GetByte(10)));
|
||||||
|
appearanceIds[Character.HIGHLIGHT_HAIR] = (uint)(reader.GetUInt32(5) | reader.GetUInt32(4) << 10); //5- Hair Highlight, 4 - Hair Style
|
||||||
|
appearanceIds[Character.VOICE] = reader.GetUInt32(19);
|
||||||
|
appearanceIds[Character.WEAPON1] = reader.GetUInt32(21);
|
||||||
|
//appearanceIds[Character.WEAPON2] = reader.GetUInt32(22);
|
||||||
|
appearanceIds[Character.HEADGEAR] = reader.GetUInt32(28);
|
||||||
|
appearanceIds[Character.BODYGEAR] = reader.GetUInt32(29);
|
||||||
|
appearanceIds[Character.LEGSGEAR] = reader.GetUInt32(30);
|
||||||
|
appearanceIds[Character.HANDSGEAR] = reader.GetUInt32(31);
|
||||||
|
appearanceIds[Character.FEETGEAR] = reader.GetUInt32(32);
|
||||||
|
appearanceIds[Character.WAISTGEAR] = reader.GetUInt32(33);
|
||||||
|
appearanceIds[Character.R_EAR] = reader.GetUInt32(34);
|
||||||
|
appearanceIds[Character.L_EAR] = reader.GetUInt32(35);
|
||||||
|
appearanceIds[Character.R_FINGER] = reader.GetUInt32(38);
|
||||||
|
appearanceIds[Character.L_FINGER] = reader.GetUInt32(39);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{ Console.WriteLine(e); }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors.Chara
|
||||||
{
|
{
|
||||||
class NpcWork
|
class NpcWork
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
using FFXIVClassic_Lobby_Server;
|
using FFXIVClassic_Lobby_Server;
|
||||||
using FFXIVClassic_Lobby_Server.common;
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
|
using FFXIVClassic_Map_Server.dataobjects;
|
||||||
|
using FFXIVClassic_Map_Server.dataobjects.chara;
|
||||||
using FFXIVClassic_Map_Server.lua;
|
using FFXIVClassic_Map_Server.lua;
|
||||||
using FFXIVClassic_Map_Server.packets.send;
|
using FFXIVClassic_Map_Server.packets.send;
|
||||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||||
@ -16,7 +18,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.chara
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Player : Character
|
class Player : Character
|
||||||
{
|
{
|
||||||
@ -482,7 +484,112 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||||||
return actorId == otherActorId;
|
return actorId == otherActorId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void loadNpcTemplate(uint id)
|
||||||
|
{
|
||||||
|
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
conn.Open();
|
||||||
|
|
||||||
|
string query = @"
|
||||||
|
SELECT
|
||||||
|
displayNameId,
|
||||||
|
customDisplayName,
|
||||||
|
base,
|
||||||
|
size,
|
||||||
|
hairStyle,
|
||||||
|
hairHighlightColor,
|
||||||
|
hairVariation,
|
||||||
|
faceType,
|
||||||
|
characteristics,
|
||||||
|
characteristicsColor,
|
||||||
|
faceEyebrows,
|
||||||
|
faceIrisSize,
|
||||||
|
faceEyeShape,
|
||||||
|
faceNose,
|
||||||
|
faceFeatures,
|
||||||
|
faceMouth,
|
||||||
|
ears,
|
||||||
|
hairColor,
|
||||||
|
skinColor,
|
||||||
|
eyeColor,
|
||||||
|
voice,
|
||||||
|
mainHand,
|
||||||
|
offHand,
|
||||||
|
spMainHand,
|
||||||
|
spOffHand,
|
||||||
|
throwing,
|
||||||
|
pack,
|
||||||
|
pouch,
|
||||||
|
head,
|
||||||
|
body,
|
||||||
|
legs,
|
||||||
|
hands,
|
||||||
|
feet,
|
||||||
|
waist,
|
||||||
|
neck,
|
||||||
|
leftEars,
|
||||||
|
rightEars,
|
||||||
|
leftIndex,
|
||||||
|
rightIndex,
|
||||||
|
leftFinger,
|
||||||
|
rightFinger
|
||||||
|
FROM gamedata_actor_templates
|
||||||
|
INNER JOIN gamedata_actor_appearance ON gamedata_actor_templates.id = gamedata_actor_appearance.id
|
||||||
|
WHERE gamedata_actor_templates.id = @templateId
|
||||||
|
";
|
||||||
|
|
||||||
|
MySqlCommand cmd = new MySqlCommand(query, conn);
|
||||||
|
cmd.Parameters.AddWithValue("@templateId", id);
|
||||||
|
|
||||||
|
using (MySqlDataReader reader = cmd.ExecuteReader())
|
||||||
|
{
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
|
||||||
|
//Handle Name
|
||||||
|
|
||||||
|
if (reader.IsDBNull(1))
|
||||||
|
displayNameId = reader.GetUInt32(0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
customDisplayName = reader.GetString(1);
|
||||||
|
displayNameId = 0xFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Handle Appearance
|
||||||
|
modelId = reader.GetUInt32(2);
|
||||||
|
appearanceIds[Character.SIZE] = reader.GetUInt32(3);
|
||||||
|
appearanceIds[Character.COLORINFO] = (uint)(reader.GetUInt32(18) | (reader.GetUInt32(17) << 10) | (reader.GetUInt32(19) << 20)); //17 - Skin Color, 16 - Hair Color, 18 - Eye Color
|
||||||
|
appearanceIds[Character.FACEINFO] = PrimitiveConversion.ToUInt32(CharacterUtils.getFaceInfo(reader.GetByte(8), reader.GetByte(9), reader.GetByte(7), reader.GetByte(16), reader.GetByte(15), reader.GetByte(14), reader.GetByte(13), reader.GetByte(12), reader.GetByte(11), reader.GetByte(10)));
|
||||||
|
appearanceIds[Character.HIGHLIGHT_HAIR] = (uint)(reader.GetUInt32(5) | reader.GetUInt32(4) << 10); //5- Hair Highlight, 4 - Hair Style
|
||||||
|
appearanceIds[Character.VOICE] = reader.GetUInt32(19);
|
||||||
|
appearanceIds[Character.WEAPON1] = reader.GetUInt32(21);
|
||||||
|
//appearanceIds[Character.WEAPON2] = reader.GetUInt32(22);
|
||||||
|
appearanceIds[Character.HEADGEAR] = reader.GetUInt32(28);
|
||||||
|
appearanceIds[Character.BODYGEAR] = reader.GetUInt32(29);
|
||||||
|
appearanceIds[Character.LEGSGEAR] = reader.GetUInt32(30);
|
||||||
|
appearanceIds[Character.HANDSGEAR] = reader.GetUInt32(31);
|
||||||
|
appearanceIds[Character.FEETGEAR] = reader.GetUInt32(32);
|
||||||
|
appearanceIds[Character.WAISTGEAR] = reader.GetUInt32(33);
|
||||||
|
appearanceIds[Character.R_EAR] = reader.GetUInt32(34);
|
||||||
|
appearanceIds[Character.L_EAR] = reader.GetUInt32(35);
|
||||||
|
appearanceIds[Character.R_FINGER] = reader.GetUInt32(38);
|
||||||
|
appearanceIds[Character.L_FINGER] = reader.GetUInt32(39);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (MySqlException e)
|
||||||
|
{ Console.WriteLine(e); }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
conn.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.dataobjects.actors
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Command : Actor
|
class Command : Actor
|
||||||
{
|
{
|
||||||
|
@ -8,7 +8,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.actors.debug
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class DebugProg : Actor
|
class DebugProg : Actor
|
||||||
{
|
{
|
||||||
|
@ -8,7 +8,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.actors.director
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class WeatherDirector : Actor
|
class WeatherDirector : Actor
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.actors.judge
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class Judge : Actor
|
class Judge : Actor
|
||||||
{
|
{
|
||||||
|
@ -8,7 +8,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.actors.world
|
namespace FFXIVClassic_Map_Server.Actors
|
||||||
{
|
{
|
||||||
class WorldMaster : Actor
|
class WorldMaster : Actor
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
using FFXIVClassic_Lobby_Server;
|
using FFXIVClassic_Lobby_Server;
|
||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara;
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -110,9 +110,8 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BasePacket p = actor.getInitPackets(playerActor.actorId);
|
basePackets.Add(actor.getSpawnPackets(playerActor.actorId, 1));
|
||||||
p.replaceActorID(playerActor.actorId);
|
basePackets.Add(actor.getInitPackets(playerActor.actorId));
|
||||||
basePackets.Add(p);
|
|
||||||
actorInstanceList.Add(actor);
|
actorInstanceList.Add(actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
using FFXIVClassic_Map_Server.dataobjects;
|
using FFXIVClassic_Map_Server.dataobjects;
|
||||||
using FFXIVClassic_Map_Server.dataobjects.actors;
|
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara;
|
|
||||||
using FFXIVClassic_Map_Server.dataobjects.chara.npc;
|
|
||||||
using FFXIVClassic_Map_Server.packets.receive.events;
|
using FFXIVClassic_Map_Server.packets.receive.events;
|
||||||
using FFXIVClassic_Map_Server.packets.send;
|
using FFXIVClassic_Map_Server.packets.send;
|
||||||
using FFXIVClassic_Map_Server.packets.send.events;
|
using FFXIVClassic_Map_Server.packets.send.events;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using FFXIVClassic_Lobby_Server.common;
|
using FFXIVClassic_Lobby_Server.common;
|
||||||
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
using FFXIVClassic_Map_Server.dataobjects;
|
using FFXIVClassic_Map_Server.dataobjects;
|
||||||
using FFXIVClassic_Map_Server.lua;
|
using FFXIVClassic_Map_Server.lua;
|
||||||
using System;
|
using System;
|
||||||
|
@ -93,7 +93,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool addProperty(FFXIVClassic_Map_Server.dataobjects.Actor actor, string name)
|
public bool addProperty(FFXIVClassic_Map_Server.Actors.Actor actor, string name)
|
||||||
{
|
{
|
||||||
string[] split = name.Split('.');
|
string[] split = name.Split('.');
|
||||||
int arrayIndex = 0;
|
int arrayIndex = 0;
|
||||||
|
@ -90,7 +90,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addProperty(FFXIVClassic_Map_Server.dataobjects.Actor actor, string name)
|
public void addProperty(FFXIVClassic_Map_Server.Actors.Actor actor, string name)
|
||||||
{
|
{
|
||||||
string[] split = name.Split('.');
|
string[] split = name.Split('.');
|
||||||
int arrayIndex = 0;
|
int arrayIndex = 0;
|
||||||
|
@ -6,6 +6,7 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FFXIVClassic_Map_Server.packets.send.actor;
|
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||||
using FFXIVClassic_Map_Server.dataobjects;
|
using FFXIVClassic_Map_Server.dataobjects;
|
||||||
|
using FFXIVClassic_Map_Server.Actors;
|
||||||
|
|
||||||
namespace FFXIVClassic_Map_Server.utils
|
namespace FFXIVClassic_Map_Server.utils
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user