NPCs now spawn and load template from the db.

This commit is contained in:
Filip Maj
2016-01-20 23:18:10 -05:00
parent 02b90edd3f
commit ea6b1e33c7
32 changed files with 357 additions and 85 deletions
+4 -1
View File
@@ -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
{
+15 -3
View File
@@ -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
{
+1 -1
View File
@@ -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
{
+136 -16
View File
@@ -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
{