mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	NPCs now spawn and load template from the db.
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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<BasePacket> 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: | ||||
|   | ||||
| @@ -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]); | ||||
|                         } | ||||
|                         }                      | ||||
|                     }                     | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -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<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) | ||||
|         { | ||||
|             ushort musicId; | ||||
|   | ||||
| @@ -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]; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
|         } | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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<Actor> 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<Actor> 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<Actor> result = new List<Actor>(); | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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<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>(); | ||||
|             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(); | ||||
|                 } | ||||
|             } | ||||
|         }  | ||||
|  | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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(); | ||||
|                 } | ||||
|             } | ||||
|         }         | ||||
|  | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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 | ||||
|     { | ||||
|   | ||||
| @@ -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); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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 | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user