diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs index 3b621095..2547dfdf 100644 --- a/FFXIVClassic Map Server/Database.cs +++ b/FFXIVClassic Map Server/Database.cs @@ -7,14 +7,13 @@ using System.Linq; using System.Text; using System.Threading.Tasks; 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_Lobby_Server.packets; using FFXIVClassic_Map_Server.packets.send.player; using FFXIVClassic_Lobby_Server.dataobjects; using FFXIVClassic_Map_Server; using FFXIVClassic_Map_Server.common.EfficientHashTables; +using FFXIVClassic_Map_Server.Actors; namespace FFXIVClassic_Lobby_Server { @@ -458,6 +457,7 @@ namespace FFXIVClassic_Lobby_Server conn.Dispose(); } } + } public static SubPacket getLatestAchievements(Player player) diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 40ffd747..b8303cf1 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -30,12 +30,7 @@ using FFXIVClassic_Map_Server.packets.send.list; using FFXIVClassic_Map_Server.packets.receive.events; using FFXIVClassic_Map_Server.packets.send.events; 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 FFXIVClassic_Map_Server.actors.debug; -using FFXIVClassic_Map_Server.actors.world; using FFXIVClassic_Map_Server.common.EfficientHashTables; namespace FFXIVClassic_Lobby_Server @@ -200,8 +195,10 @@ namespace FFXIVClassic_Lobby_Server //Update Instance List instanceUpdatePackets = player.updateInstance(player.getActor().zone.getActorsAroundActor(player.getActor(), 50)); foreach (BasePacket bp in instanceUpdatePackets) + { + // bp.debugPrintPacket(); client.queuePacket(bp); - + } break; //Set Target case 0x00CD: diff --git a/FFXIVClassic Map Server/Program.cs b/FFXIVClassic Map Server/Program.cs index d350ce99..444a84da 100644 --- a/FFXIVClassic Map Server/Program.cs +++ b/FFXIVClassic Map Server/Program.cs @@ -126,11 +126,7 @@ namespace FFXIVClassic_Lobby_Server else if (split[0].Equals("property")) { 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]); - } + } } } } diff --git a/FFXIVClassic Map Server/Server.cs b/FFXIVClassic Map Server/Server.cs index 00feb077..5c1ca01c 100644 --- a/FFXIVClassic Map Server/Server.cs +++ b/FFXIVClassic Map Server/Server.cs @@ -12,9 +12,9 @@ using FFXIVClassic_Lobby_Server.packets; using System.IO; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server; -using FFXIVClassic_Map_Server.actors; using FFXIVClassic_Map_Server.packets.send; using FFXIVClassic_Map_Server.dataobjects.chara; +using FFXIVClassic_Map_Server.Actors; namespace FFXIVClassic_Lobby_Server { @@ -40,6 +40,7 @@ namespace FFXIVClassic_Lobby_Server mWorldManager = new WorldManager(this); mWorldManager.LoadZoneList(); mWorldManager.LoadZoneEntranceList(); + mWorldManager.LoadNPCs(); 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 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) { ushort musicId; diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs index ad30ee90..0700c9e5 100644 --- a/FFXIVClassic Map Server/WorldManager.cs +++ b/FFXIVClassic Map Server/WorldManager.cs @@ -1,8 +1,6 @@ using FFXIVClassic_Lobby_Server; using FFXIVClassic_Lobby_Server.common; -using FFXIVClassic_Map_Server.actors; -using FFXIVClassic_Map_Server.actors.debug; -using FFXIVClassic_Map_Server.actors.world; +using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.common.EfficientHashTables; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.dataobjects.chara; @@ -124,6 +122,61 @@ namespace FFXIVClassic_Map_Server 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. public void DoSeamlessZoneChange(Player player, uint destinationZoneId) { @@ -235,6 +288,8 @@ namespace FFXIVClassic_Map_Server public Zone GetZone(uint zoneId) { + if (!zoneList.ContainsKey(zoneId)) + return null; return zoneList[zoneId]; } diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 48b9301f..89750949 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -12,7 +12,7 @@ using System.Linq; using System.Reflection; using System.Text; -namespace FFXIVClassic_Map_Server.dataobjects +namespace FFXIVClassic_Map_Server.Actors { class Actor { @@ -121,6 +121,9 @@ namespace FFXIVClassic_Map_Server.dataobjects public virtual BasePacket getInitPackets(uint playerActorId) { SetActorPropetyPacket initProperties = new SetActorPropetyPacket("/_init"); + initProperties.addByte(0xE14B0CA8, 1); + initProperties.addByte(0x2138FD71, 1); + initProperties.addByte(0xFBFBCFB1, 1); initProperties.addTarget(); return BasePacket.createPacket(initProperties.buildPacket(playerActorId, actorId), true, false); } diff --git a/FFXIVClassic Map Server/actors/StaticActors.cs b/FFXIVClassic Map Server/actors/StaticActors.cs index bb605ad0..651e2c1c 100644 --- a/FFXIVClassic Map Server/actors/StaticActors.cs +++ b/FFXIVClassic Map Server/actors/StaticActors.cs @@ -1,13 +1,11 @@ -using FFXIVClassic_Map_Server.actors.judge; -using FFXIVClassic_Map_Server.dataobjects; -using FFXIVClassic_Map_Server.dataobjects.actors; +using FFXIVClassic_Map_Server.dataobjects; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.actors +namespace FFXIVClassic_Map_Server.Actors { class StaticActors { diff --git a/FFXIVClassic Map Server/actors/area/Zone.cs b/FFXIVClassic Map Server/actors/area/Zone.cs index a8c7caf2..085da01b 100644 --- a/FFXIVClassic Map Server/actors/area/Zone.cs +++ b/FFXIVClassic Map Server/actors/area/Zone.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server +namespace FFXIVClassic_Map_Server.Actors { class Zone : Actor { @@ -21,7 +21,7 @@ namespace FFXIVClassic_Map_Server public ushort bgmDay, bgmNight, bgmBattle; 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 halfWidth, halfHeight; @@ -182,6 +182,8 @@ namespace FFXIVClassic_Map_Server public List getActorsAroundPoint(float x, float y, int checkDistance) { + checkDistance /= boundingGridSize; + int gridX = (int)x/boundingGridSize; int gridY = (int)y/boundingGridSize; @@ -213,13 +215,23 @@ namespace FFXIVClassic_Map_Server public List getActorsAroundActor(Actor actor, int checkDistance) { + checkDistance /= boundingGridSize; + int gridX = (int)actor.positionX / boundingGridSize; int gridY = (int)actor.positionZ / boundingGridSize; gridX += halfWidth; 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 result = new List(); diff --git a/FFXIVClassic Map Server/actors/chara/AetheryteWork.cs b/FFXIVClassic Map Server/actors/chara/AetheryteWork.cs index fd1f33b9..c58166f0 100644 --- a/FFXIVClassic Map Server/actors/chara/AetheryteWork.cs +++ b/FFXIVClassic Map Server/actors/chara/AetheryteWork.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class AetheryteWork { diff --git a/FFXIVClassic Map Server/actors/chara/BattleSave.cs b/FFXIVClassic Map Server/actors/chara/BattleSave.cs index da2c38ac..60d16106 100644 --- a/FFXIVClassic Map Server/actors/chara/BattleSave.cs +++ b/FFXIVClassic Map Server/actors/chara/BattleSave.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class BattleSave { diff --git a/FFXIVClassic Map Server/actors/chara/BattleTemp.cs b/FFXIVClassic Map Server/actors/chara/BattleTemp.cs index 2c90f8f5..ab20425c 100644 --- a/FFXIVClassic Map Server/actors/chara/BattleTemp.cs +++ b/FFXIVClassic Map Server/actors/chara/BattleTemp.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class BattleTemp { diff --git a/FFXIVClassic Map Server/actors/chara/CharaWork.cs b/FFXIVClassic Map Server/actors/chara/CharaWork.cs index 49b999aa..8a35de68 100644 --- a/FFXIVClassic Map Server/actors/chara/CharaWork.cs +++ b/FFXIVClassic Map Server/actors/chara/CharaWork.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class CharaWork { diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 0a7c08eb..bf9fba7f 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -1,5 +1,5 @@ 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 System; using System.Collections.Generic; @@ -7,7 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors { class Character:Actor { diff --git a/FFXIVClassic Map Server/actors/chara/EventSave.cs b/FFXIVClassic Map Server/actors/chara/EventSave.cs index 7365aa11..21eebcf7 100644 --- a/FFXIVClassic Map Server/actors/chara/EventSave.cs +++ b/FFXIVClassic Map Server/actors/chara/EventSave.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class EventSave { diff --git a/FFXIVClassic Map Server/actors/chara/EventTemp.cs b/FFXIVClassic Map Server/actors/chara/EventTemp.cs index c8dcf4bf..4756ffee 100644 --- a/FFXIVClassic Map Server/actors/chara/EventTemp.cs +++ b/FFXIVClassic Map Server/actors/chara/EventTemp.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class EventTemp { diff --git a/FFXIVClassic Map Server/actors/chara/ParameterSave.cs b/FFXIVClassic Map Server/actors/chara/ParameterSave.cs index 1a4dab00..a03d46e9 100644 --- a/FFXIVClassic Map Server/actors/chara/ParameterSave.cs +++ b/FFXIVClassic Map Server/actors/chara/ParameterSave.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class ParameterSave { diff --git a/FFXIVClassic Map Server/actors/chara/ParameterTemp.cs b/FFXIVClassic Map Server/actors/chara/ParameterTemp.cs index d912aec8..9a1b12d7 100644 --- a/FFXIVClassic Map Server/actors/chara/ParameterTemp.cs +++ b/FFXIVClassic Map Server/actors/chara/ParameterTemp.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class ParameterTemp { diff --git a/FFXIVClassic Map Server/actors/chara/Work.cs b/FFXIVClassic Map Server/actors/chara/Work.cs index 4dd577b5..4b62a316 100644 --- a/FFXIVClassic Map Server/actors/chara/Work.cs +++ b/FFXIVClassic Map Server/actors/chara/Work.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.actors.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class Work { diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index a4ca84d7..6f78d945 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -3,52 +3,172 @@ using FFXIVClassic_Lobby_Server.common; using FFXIVClassic_Lobby_Server.packets; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; +using FFXIVClassic_Map_Server.utils; +using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara.npc +namespace FFXIVClassic_Map_Server.Actors { 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) { this.actorName = actorName; - this.displayNameId = displayNameId; - this.customDisplayName = customDisplayName; - this.positionX = positionX; - this.positionY = positionY; - this.positionZ = positionZ; - this.rotation = rotation; + this.positionX = posX; + this.positionY = posY; + this.positionZ = posZ; + this.rotation = rot; this.animationId = animationId; this.className = className; - if (initParams.Length != 0) - this.classParams = LuaUtils.readLuaParams(initParams); + this.displayNameId = displayNameId; + 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 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 subpackets = new List(); subpackets.Add(createAddActorPacket(playerActorId)); - subpackets.Add(createSpeedPacket(playerActorId)); - subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1)); + subpackets.Add(createSpeedPacket(playerActorId)); + subpackets.Add(createSpawnPositonPacket(playerActorId, 0x0)); subpackets.Add(createAppearancePacket(playerActorId)); subpackets.Add(createNamePacket(playerActorId)); - subpackets.Add(_0xFPacket.buildPacket(playerActorId, playerActorId)); subpackets.Add(createStatePacket(playerActorId)); subpackets.Add(createIdleAnimationPacket(playerActorId)); subpackets.Add(createInitStatusPacket(playerActorId)); subpackets.Add(createSetActorIconPacket(playerActorId)); - subpackets.Add(createIsZoneingPacket(playerActorId)); - subpackets.Add(createScriptBindPacket(playerActorId)); + subpackets.Add(createIsZoneingPacket(playerActorId)); + subpackets.Add(createScriptBindPacket(playerActorId)); 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(); + } + } + } + } } diff --git a/FFXIVClassic Map Server/actors/chara/npc/NpcWork.cs b/FFXIVClassic Map Server/actors/chara/npc/NpcWork.cs index c10b7047..1d069f8e 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/NpcWork.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/NpcWork.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors.Chara { class NpcWork { diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 8859c249..f3cac6cb 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -1,6 +1,8 @@ using FFXIVClassic_Lobby_Server; using FFXIVClassic_Lobby_Server.common; 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.packets.send; using FFXIVClassic_Map_Server.packets.send.actor; @@ -16,7 +18,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.chara +namespace FFXIVClassic_Map_Server.Actors { class Player : Character { @@ -482,7 +484,112 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara 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(); + } + } + } } } diff --git a/FFXIVClassic Map Server/actors/command/Command.cs b/FFXIVClassic Map Server/actors/command/Command.cs index c0751ece..03e4e064 100644 --- a/FFXIVClassic Map Server/actors/command/Command.cs +++ b/FFXIVClassic Map Server/actors/command/Command.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.dataobjects.actors +namespace FFXIVClassic_Map_Server.Actors { class Command : Actor { diff --git a/FFXIVClassic Map Server/actors/debug/Debug.cs b/FFXIVClassic Map Server/actors/debug/Debug.cs index 13192ff4..63b1ec9d 100644 --- a/FFXIVClassic Map Server/actors/debug/Debug.cs +++ b/FFXIVClassic Map Server/actors/debug/Debug.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.actors.debug +namespace FFXIVClassic_Map_Server.Actors { class DebugProg : Actor { diff --git a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs index d96e391c..2dd303ee 100644 --- a/FFXIVClassic Map Server/actors/director/WeatherDirector.cs +++ b/FFXIVClassic Map Server/actors/director/WeatherDirector.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.actors.director +namespace FFXIVClassic_Map_Server.Actors { class WeatherDirector : Actor { diff --git a/FFXIVClassic Map Server/actors/judge/Judge.cs b/FFXIVClassic Map Server/actors/judge/Judge.cs index d7871f9b..b2ab5531 100644 --- a/FFXIVClassic Map Server/actors/judge/Judge.cs +++ b/FFXIVClassic Map Server/actors/judge/Judge.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.actors.judge +namespace FFXIVClassic_Map_Server.Actors { class Judge : Actor { diff --git a/FFXIVClassic Map Server/actors/world/WorldMaster.cs b/FFXIVClassic Map Server/actors/world/WorldMaster.cs index a5df2016..076324e5 100644 --- a/FFXIVClassic Map Server/actors/world/WorldMaster.cs +++ b/FFXIVClassic Map Server/actors/world/WorldMaster.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace FFXIVClassic_Map_Server.actors.world +namespace FFXIVClassic_Map_Server.Actors { class WorldMaster : Actor { diff --git a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs index a53e35b8..55c6f2a5 100644 --- a/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs +++ b/FFXIVClassic Map Server/dataobjects/ConnectedPlayer.cs @@ -1,6 +1,6 @@ using FFXIVClassic_Lobby_Server; using FFXIVClassic_Lobby_Server.packets; -using FFXIVClassic_Map_Server.dataobjects.chara; +using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.packets.send.actor; using System; using System.Collections.Generic; @@ -110,9 +110,8 @@ namespace FFXIVClassic_Map_Server.dataobjects } else { - BasePacket p = actor.getInitPackets(playerActor.actorId); - p.replaceActorID(playerActor.actorId); - basePackets.Add(p); + basePackets.Add(actor.getSpawnPackets(playerActor.actorId, 1)); + basePackets.Add(actor.getInitPackets(playerActor.actorId)); actorInstanceList.Add(actor); } } diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index 79bf5034..70fbc455 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -1,8 +1,6 @@ using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.Actors; 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.send; using FFXIVClassic_Map_Server.packets.send.events; diff --git a/FFXIVClassic Map Server/lua/LuaUtils.cs b/FFXIVClassic Map Server/lua/LuaUtils.cs index c8c8a41c..fe2f68c5 100644 --- a/FFXIVClassic Map Server/lua/LuaUtils.cs +++ b/FFXIVClassic Map Server/lua/LuaUtils.cs @@ -1,4 +1,5 @@ using FFXIVClassic_Lobby_Server.common; +using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.dataobjects; using FFXIVClassic_Map_Server.lua; using System; diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs index 7016fd9b..afb787ac 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorPropetyPacket.cs @@ -93,7 +93,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor 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('.'); int arrayIndex = 0; diff --git a/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs b/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs index 59e812f5..ebec18c7 100644 --- a/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs +++ b/FFXIVClassic Map Server/packets/send/list/SetListPropertyPacket.cs @@ -90,7 +90,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor 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('.'); int arrayIndex = 0; diff --git a/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs b/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs index ab50dab9..25b5e0e8 100644 --- a/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs +++ b/FFXIVClassic Map Server/utils/ActorPropertyPacketUtil.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using FFXIVClassic_Map_Server.packets.send.actor; using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.Actors; namespace FFXIVClassic_Map_Server.utils {