mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-25 06:07:46 +00:00
Fixed a character appearance bug when making a character. Current zone now shown. Added a utility for setting new gear appearance.
This commit is contained in:
parent
23dcc1dafe
commit
1c5f8b3d0b
7 changed files with 161 additions and 20 deletions
|
@ -53,7 +53,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
conn.Open();
|
conn.Open();
|
||||||
|
|
||||||
//Check if exists
|
//Check if exists
|
||||||
MySqlCommand cmd = new MySqlCommand("SELECT * FROM characters WHERE name=@name AND serverId=@serverId", conn);
|
MySqlCommand cmd = new MySqlCommand("SELECT * FROM characters WHERE name=@name AND serverId=@serverId AND state != 2 AND state != 1", conn);
|
||||||
cmd.Parameters.AddWithValue("@serverId", serverId);
|
cmd.Parameters.AddWithValue("@serverId", serverId);
|
||||||
cmd.Parameters.AddWithValue("@name", name);
|
cmd.Parameters.AddWithValue("@name", name);
|
||||||
using (MySqlDataReader Reader = cmd.ExecuteReader())
|
using (MySqlDataReader Reader = cmd.ExecuteReader())
|
||||||
|
@ -111,19 +111,72 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
conn.Open();
|
conn.Open();
|
||||||
MySqlCommand cmd = new MySqlCommand();
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
cmd.Connection = conn;
|
cmd.Connection = conn;
|
||||||
cmd.CommandText = "UPDATE characters SET state=2, charaInfo=@encodedInfo WHERE userId=@userId AND id=@cid";
|
cmd.CommandText = @"
|
||||||
cmd.Prepare();
|
UPDATE characters SET
|
||||||
|
state=2,
|
||||||
|
currentZoneId=@zoneId,
|
||||||
|
positionX=@x,
|
||||||
|
positionY=@y,
|
||||||
|
positionZ=@z,
|
||||||
|
rotation=@r,
|
||||||
|
guardian=@guardian,
|
||||||
|
birthDay=@birthDay,
|
||||||
|
birthMonth=@birthMonth,
|
||||||
|
initialTown=@initialTown,
|
||||||
|
tribe=@tribe,
|
||||||
|
currentClassJob=@currentClass
|
||||||
|
WHERE userId=@userId AND id=@cid;
|
||||||
|
|
||||||
|
INSERT INTO characters_appearance
|
||||||
|
(characterId, baseId, size, voice, skinColor, hairStyle, hairColor, hairHighlightColor, eyeColor, faceType, faceEyebrows, faceEyeShape, faceIrisSize, faceNose, faceMouth, faceFeatures, ears, characteristics, characteristicsColor, mainhand, head, body, hands, legs, feet)
|
||||||
|
VALUES
|
||||||
|
(@cid, 4294967295, @size, @voice, @skinColor, @hairStyle, @hairColor, @hairHighlightColor, @eyeColor, @faceType, @faceEyebrows, @faceEyeShape, @faceIrisSize, @faceNose, @faceMouth, @faceFeatures, @ears, @characteristics, @characteristicsColor, @mainhand, @head, @body, @hands, @legs, @feet)
|
||||||
|
";
|
||||||
cmd.Parameters.AddWithValue("@userId", accountId);
|
cmd.Parameters.AddWithValue("@userId", accountId);
|
||||||
cmd.Parameters.AddWithValue("@cid", cid);
|
cmd.Parameters.AddWithValue("@cid", cid);
|
||||||
string json = JsonConvert.SerializeObject(charaInfo);
|
cmd.Parameters.AddWithValue("@guardian", charaInfo.guardian);
|
||||||
cmd.Parameters.AddWithValue("@encodedInfo", json);
|
cmd.Parameters.AddWithValue("@birthDay", charaInfo.birthDay);
|
||||||
|
cmd.Parameters.AddWithValue("@birthMonth", charaInfo.birthMonth);
|
||||||
|
cmd.Parameters.AddWithValue("@initialTown", charaInfo.initialTown);
|
||||||
|
cmd.Parameters.AddWithValue("@tribe", charaInfo.tribe);
|
||||||
|
cmd.Parameters.AddWithValue("@currentClass", charaInfo.currentClass);
|
||||||
|
|
||||||
|
cmd.Parameters.AddWithValue("@zoneId", charaInfo.zoneId);
|
||||||
|
cmd.Parameters.AddWithValue("@x", charaInfo.x);
|
||||||
|
cmd.Parameters.AddWithValue("@y", charaInfo.y);
|
||||||
|
cmd.Parameters.AddWithValue("@z", charaInfo.z);
|
||||||
|
cmd.Parameters.AddWithValue("@r", charaInfo.rot);
|
||||||
|
|
||||||
|
cmd.Parameters.AddWithValue("@size", charaInfo.appearance.size);
|
||||||
|
cmd.Parameters.AddWithValue("@voice", charaInfo.appearance.voice);
|
||||||
|
cmd.Parameters.AddWithValue("@skinColor", charaInfo.appearance.skinColor);
|
||||||
|
cmd.Parameters.AddWithValue("@hairStyle", charaInfo.appearance.hairStyle);
|
||||||
|
cmd.Parameters.AddWithValue("@hairColor", charaInfo.appearance.hairColor);
|
||||||
|
cmd.Parameters.AddWithValue("@hairHighlightColor", charaInfo.appearance.hairHighlightColor);
|
||||||
|
cmd.Parameters.AddWithValue("@eyeColor", charaInfo.appearance.eyeColor);
|
||||||
|
cmd.Parameters.AddWithValue("@faceType", charaInfo.appearance.faceType);
|
||||||
|
cmd.Parameters.AddWithValue("@faceEyebrows", charaInfo.appearance.faceEyebrows);
|
||||||
|
cmd.Parameters.AddWithValue("@faceEyeShape", charaInfo.appearance.faceEyeShape);
|
||||||
|
cmd.Parameters.AddWithValue("@faceIrisSize", charaInfo.appearance.faceIrisSize);
|
||||||
|
cmd.Parameters.AddWithValue("@faceNose", charaInfo.appearance.faceNose);
|
||||||
|
cmd.Parameters.AddWithValue("@faceMouth", charaInfo.appearance.faceMouth);
|
||||||
|
cmd.Parameters.AddWithValue("@faceFeatures", charaInfo.appearance.faceFeatures);
|
||||||
|
cmd.Parameters.AddWithValue("@ears", charaInfo.appearance.ears);
|
||||||
|
cmd.Parameters.AddWithValue("@characteristics", charaInfo.appearance.characteristics);
|
||||||
|
cmd.Parameters.AddWithValue("@characteristicsColor", charaInfo.appearance.characteristicsColor);
|
||||||
|
|
||||||
|
cmd.Parameters.AddWithValue("@mainhand", 0);
|
||||||
|
cmd.Parameters.AddWithValue("@head", 1024);
|
||||||
|
cmd.Parameters.AddWithValue("@body", 1024);
|
||||||
|
cmd.Parameters.AddWithValue("@hands", 1024);
|
||||||
|
cmd.Parameters.AddWithValue("@legs", 1024);
|
||||||
|
cmd.Parameters.AddWithValue("@feet", 1024);
|
||||||
|
|
||||||
cmd.ExecuteNonQuery();
|
cmd.ExecuteNonQuery();
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (MySqlException e)
|
catch (MySqlException e)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
@ -246,7 +299,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
conn.Open();
|
conn.Open();
|
||||||
MySqlCommand cmd = new MySqlCommand();
|
MySqlCommand cmd = new MySqlCommand();
|
||||||
cmd.Connection = conn;
|
cmd.Connection = conn;
|
||||||
cmd.CommandText = "DELETE FROM characters WHERE id=@cid AND name=@name";
|
cmd.CommandText = "UPDATE characters SET state=1 WHERE id=@cid AND name=@name";
|
||||||
cmd.Prepare();
|
cmd.Prepare();
|
||||||
cmd.Parameters.AddWithValue("@cid", characterId);
|
cmd.Parameters.AddWithValue("@cid", characterId);
|
||||||
cmd.Parameters.AddWithValue("@name", name);
|
cmd.Parameters.AddWithValue("@name", name);
|
||||||
|
@ -316,7 +369,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
conn.Open();
|
conn.Open();
|
||||||
charaList = conn.Query<Character>("SELECT * FROM characters WHERE userId=@UserId AND state in (1,2) ORDER BY slot", new { UserId = userId }).ToList();
|
charaList = conn.Query<Character>("SELECT * FROM characters WHERE userId=@UserId AND state = 2 ORDER BY slot", new { UserId = userId }).ToList();
|
||||||
}
|
}
|
||||||
catch (MySqlException e)
|
catch (MySqlException e)
|
||||||
{ charaList = new List<Character>(); }
|
{ charaList = new List<Character>(); }
|
||||||
|
|
|
@ -87,6 +87,7 @@
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Server.cs" />
|
<Compile Include="Server.cs" />
|
||||||
|
<Compile Include="utils\CharacterCreatorUtils.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
using FFXIVClassic_Lobby_Server.dataobjects;
|
using FFXIVClassic_Lobby_Server.dataobjects;
|
||||||
using FFXIVClassic_Lobby_Server.packets;
|
using FFXIVClassic_Lobby_Server.packets;
|
||||||
using FFXIVClassic_Lobby_Server.packets.receive;
|
using FFXIVClassic_Lobby_Server.packets.receive;
|
||||||
|
using FFXIVClassic_Lobby_Server.utils;
|
||||||
using MySql.Data.MySqlClient;
|
using MySql.Data.MySqlClient;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
@ -80,6 +81,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
|
|
||||||
private void ProcessSessionAcknowledgement(ClientConnection client, SubPacket packet)
|
private void ProcessSessionAcknowledgement(ClientConnection client, SubPacket packet)
|
||||||
{
|
{
|
||||||
|
packet.debugPrintSubPacket();
|
||||||
SessionPacket sessionPacket = new SessionPacket(packet.data);
|
SessionPacket sessionPacket = new SessionPacket(packet.data);
|
||||||
String clientVersion = sessionPacket.version;
|
String clientVersion = sessionPacket.version;
|
||||||
|
|
||||||
|
@ -159,7 +161,6 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
{
|
{
|
||||||
CharacterModifyPacket charaReq = new CharacterModifyPacket(packet.data);
|
CharacterModifyPacket charaReq = new CharacterModifyPacket(packet.data);
|
||||||
var slot = charaReq.slot;
|
var slot = charaReq.slot;
|
||||||
var code = charaReq.command;
|
|
||||||
var name = charaReq.characterName;
|
var name = charaReq.characterName;
|
||||||
var worldId = charaReq.worldId;
|
var worldId = charaReq.worldId;
|
||||||
|
|
||||||
|
@ -196,7 +197,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
|
|
||||||
bool alreadyTaken;
|
bool alreadyTaken;
|
||||||
|
|
||||||
switch (code)
|
switch (charaReq.command)
|
||||||
{
|
{
|
||||||
case 0x01://Reserve
|
case 0x01://Reserve
|
||||||
|
|
||||||
|
@ -227,6 +228,45 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
case 0x02://Make
|
case 0x02://Make
|
||||||
CharaInfo info = CharaInfo.getFromNewCharRequest(charaReq.characterInfoEncoded);
|
CharaInfo info = CharaInfo.getFromNewCharRequest(charaReq.characterInfoEncoded);
|
||||||
|
|
||||||
|
//Set Initial Appearance
|
||||||
|
/*
|
||||||
|
uint[] classAppearance = CharacterCreatorUtils.getEquipmentForClass(info.currentClass);
|
||||||
|
info.weapon1 = classAppearance[0];
|
||||||
|
info.weapon2 = classAppearance[1];
|
||||||
|
info.head = classAppearance[2];
|
||||||
|
info.body = classAppearance[3];
|
||||||
|
info.hands = classAppearance[4];
|
||||||
|
info.legs = classAppearance[5];
|
||||||
|
info.feet = classAppearance[6];
|
||||||
|
info.belt = classAppearance[7];
|
||||||
|
|
||||||
|
*/
|
||||||
|
//Set Initial Position
|
||||||
|
switch (info.initialTown)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
info.zoneId = 193;
|
||||||
|
info.x = 0.016f;
|
||||||
|
info.y = 10.35f;
|
||||||
|
info.z = -36.91f;
|
||||||
|
info.rot = 0.025f;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
info.zoneId = 166;
|
||||||
|
info.x = 356.09f;
|
||||||
|
info.y = 3.74f;
|
||||||
|
info.z = -701.62f;
|
||||||
|
info.rot = -1.4f;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
info.zoneId = 184;
|
||||||
|
info.x = 12.63f;
|
||||||
|
info.y = 196.05f;
|
||||||
|
info.z = 131.01f;
|
||||||
|
info.rot = -1.34f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Database.makeCharacter(client.currentUserId, client.newCharaCid, info);
|
Database.makeCharacter(client.currentUserId, client.newCharaCid, info);
|
||||||
|
|
||||||
pid = 1;
|
pid = 1;
|
||||||
|
@ -264,7 +304,7 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CharaCreatorPacket charaCreator = new CharaCreatorPacket(charaReq.sequence, code, pid, cid, 1, name, worldName);
|
CharaCreatorPacket charaCreator = new CharaCreatorPacket(charaReq.sequence, charaReq.command, pid, cid, 1, name, worldName);
|
||||||
BasePacket charaCreatorPacket = BasePacket.createPacket(charaCreator.buildPacket(), true, false);
|
BasePacket charaCreatorPacket = BasePacket.createPacket(charaCreator.buildPacket(), true, false);
|
||||||
BasePacket.encryptPacket(client.blowfish, charaCreatorPacket);
|
BasePacket.encryptPacket(client.blowfish, charaCreatorPacket);
|
||||||
client.queuePacket(charaCreatorPacket);
|
client.queuePacket(charaCreatorPacket);
|
||||||
|
|
|
@ -43,9 +43,12 @@ namespace FFXIVClassic_Lobby_Server.dataobjects
|
||||||
public uint birthDay = 0;
|
public uint birthDay = 0;
|
||||||
public uint currentClass = 0;
|
public uint currentClass = 0;
|
||||||
public uint currentJob = 0;
|
public uint currentJob = 0;
|
||||||
public uint allegiance = 0;
|
public uint initialTown = 0;
|
||||||
public uint tribe = 0;
|
public uint tribe = 0;
|
||||||
|
|
||||||
|
public ushort zoneId;
|
||||||
|
public float x, y, z, rot;
|
||||||
|
|
||||||
public uint currentLevel = 1;
|
public uint currentLevel = 1;
|
||||||
|
|
||||||
public static CharaInfo getFromNewCharRequest(String encoded)
|
public static CharaInfo getFromNewCharRequest(String encoded)
|
||||||
|
@ -97,7 +100,7 @@ namespace FFXIVClassic_Lobby_Server.dataobjects
|
||||||
|
|
||||||
reader.BaseStream.Seek(0x10, SeekOrigin.Current);
|
reader.BaseStream.Seek(0x10, SeekOrigin.Current);
|
||||||
|
|
||||||
info.allegiance = reader.ReadByte();
|
info.initialTown = reader.ReadByte();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,13 +20,13 @@ namespace FFXIVClassic_Lobby_Server
|
||||||
public bool doRename;
|
public bool doRename;
|
||||||
public uint currentZoneId;
|
public uint currentZoneId;
|
||||||
|
|
||||||
public byte guardian = 0;
|
public byte guardian;
|
||||||
public byte birthMonth = 0;
|
public byte birthMonth;
|
||||||
public byte birthDay = 0;
|
public byte birthDay;
|
||||||
public uint currentClass = 3;
|
public uint currentClass = 3;
|
||||||
public uint currentJob = 0;
|
public uint currentJob = 0;
|
||||||
public byte initialTown = 0;
|
public byte initialTown;
|
||||||
public byte tribe = 0;
|
public byte tribe;
|
||||||
|
|
||||||
public uint currentLevel = 1;
|
public uint currentLevel = 1;
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ namespace FFXIVClassic_Lobby_Server.packets
|
||||||
|
|
||||||
binWriter.Write((byte)options); //Options (0x01: Service Account not active, 0x72: Change Chara Name)
|
binWriter.Write((byte)options); //Options (0x01: Service Account not active, 0x72: Change Chara Name)
|
||||||
binWriter.Write((ushort)0);
|
binWriter.Write((ushort)0);
|
||||||
binWriter.Write((uint)0xF4); //Logged out zone
|
binWriter.Write((uint)chara.currentZoneId); //Logged out zone
|
||||||
binWriter.Write(Encoding.ASCII.GetBytes(chara.name.PadRight(0x20, '\0'))); //Name
|
binWriter.Write(Encoding.ASCII.GetBytes(chara.name.PadRight(0x20, '\0'))); //Name
|
||||||
binWriter.Write(Encoding.ASCII.GetBytes(worldname.PadRight(0xE, '\0'))); //World Name
|
binWriter.Write(Encoding.ASCII.GetBytes(worldname.PadRight(0xE, '\0'))); //World Name
|
||||||
|
|
||||||
|
|
44
FFXIVClassic_Lobby_Server/utils/CharacterCreatorUtils.cs
Normal file
44
FFXIVClassic_Lobby_Server/utils/CharacterCreatorUtils.cs
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace FFXIVClassic_Lobby_Server.utils
|
||||||
|
{
|
||||||
|
class CharacterCreatorUtils
|
||||||
|
{
|
||||||
|
private static readonly Dictionary<uint, uint[]> equipmentAppearance = new Dictionary<uint, uint[]>
|
||||||
|
{
|
||||||
|
{ 2, new uint[]{1} }, //PUG
|
||||||
|
{ 3, new uint[]{1} }, //GLA
|
||||||
|
{ 4, new uint[]{1} }, //MRD
|
||||||
|
{ 7, new uint[]{1} }, //ARC
|
||||||
|
|
||||||
|
{ 22, new uint[]{1} }, //THM
|
||||||
|
{ 23, new uint[]{1} }, //CNJ
|
||||||
|
|
||||||
|
{ 29, new uint[]{1} }, //CRP
|
||||||
|
{ 30, new uint[]{1} }, //BSM
|
||||||
|
{ 31, new uint[]{1} }, //ARM
|
||||||
|
{ 32, new uint[]{1} }, //GSM
|
||||||
|
{ 33, new uint[]{1} }, //LTW
|
||||||
|
{ 34, new uint[]{1} }, //WVR
|
||||||
|
{ 35, new uint[]{1} }, //ALC
|
||||||
|
{ 36, new uint[]{1} }, //CUL
|
||||||
|
|
||||||
|
{ 39, new uint[]{1} }, //MIN
|
||||||
|
{ 40, new uint[]{1} }, //BOT
|
||||||
|
{ 41, new uint[]{1} }, //FSH
|
||||||
|
};
|
||||||
|
|
||||||
|
public static uint[] getEquipmentForClass(uint charClass)
|
||||||
|
{
|
||||||
|
if (equipmentAppearance.ContainsKey(charClass))
|
||||||
|
return equipmentAppearance[charClass];
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue