Merge branch 'master' into develop

# Conflicts:
#	FFXIVClassic Map Server/CommandProcessor.cs
This commit is contained in:
Filip Maj 2016-06-12 18:51:24 -04:00
commit fec348136e
55 changed files with 37771 additions and 35959 deletions

View file

@ -102,7 +102,6 @@ namespace FFXIVClassic_Lobby_Server
public void doWarp(ConnectedPlayer client, uint id)
{
WorldManager worldManager = Server.GetWorldManager();
FFXIVClassic_Map_Server.WorldManager.ZoneEntrance ze = worldManager.getZoneEntrance(id);
if (ze == null)
@ -119,10 +118,9 @@ namespace FFXIVClassic_Lobby_Server
}
}
public void doWarp(ConnectedPlayer client, uint zoneId, string privateArea, float x, float y, float z, float r)
public void doWarp(ConnectedPlayer client, uint zoneId, string privateArea, byte spawnType, float x, float y, float z, float r)
{
WorldManager worldManager = Server.GetWorldManager();
if (worldManager.GetZone(zoneId) == null)
{
if (client != null)
@ -131,12 +129,12 @@ namespace FFXIVClassic_Lobby_Server
}
if (client != null)
worldManager.DoZoneChange(client.getActor(), zoneId, privateArea, 0x2, x, y, z, r);
worldManager.DoZoneChange(client.getActor(), zoneId, privateArea, spawnType, x, y, z, r);
else
{
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
{
worldManager.DoZoneChange(entry.Value.getActor(), zoneId, privateArea, 0x2, x, y, z, r);
worldManager.DoZoneChange(entry.Value.getActor(), zoneId, privateArea, spawnType, x, y, z, r);
}
}
}
@ -149,7 +147,7 @@ namespace FFXIVClassic_Lobby_Server
client.queuePacket(BasePacket.createPacket(SendMessagePacket.buildPacket(client.actorID, client.actorID, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", String.Format("{0}\'s position: ZoneID: {1}, X: {2}, Y: {3}, Z: {4}, Rotation: {5}", p.customDisplayName, p.zoneId, p.positionX, p.positionY, p.positionZ, p.rotation)), true, false));
}
else
{
{
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
{
Player p = entry.Value.getActor();
@ -397,7 +395,7 @@ namespace FFXIVClassic_Lobby_Server
#endregion
sendMessage(client, String.Format("Warping to: ZoneID: {0} X: {1}, Y: {2}, Z: {3}", zoneId, x, y, z));
doWarp(client, zoneId, privatearea, x, y, z, r);
doWarp(client, zoneId, privatearea, 0x00, x, y, z, r);
}
else if (split.Length == 5)
{
@ -423,7 +421,7 @@ namespace FFXIVClassic_Lobby_Server
#endregion
sendMessage(client, String.Format("Warping to: ZoneID: {0} X: {1}, Y: {2}, Z: {3}", zoneId, x, y, z));
doWarp(client, zoneId, privatearea, x, y, z, r);
doWarp(client, zoneId, privatearea, 0x2, x, y, z, r);
}
else if (split.Length == 6)
{
@ -451,12 +449,42 @@ namespace FFXIVClassic_Lobby_Server
#endregion
sendMessage(client, String.Format("Warping to: ZoneID: {0} X: {1}, Y: {2}, Z: {3}", zoneId, x, y, z));
doWarp(client, zoneId, privatearea, x, y, z, r);
doWarp(client, zoneId, privatearea, 0x2, x, y, z, r);
}
else
return; // catch any invalid warps here
}
private void doWeather(ConnectedPlayer client, string weatherID, string value)
{
ushort weather = Convert.ToUInt16(weatherID);
if (client != null)
{
client.queuePacket(BasePacket.createPacket(SetWeatherPacket.buildPacket(client.actorID, weather, Convert.ToUInt16(value)), true, false));
}
/*
* WIP: Change weather serverside, currently only clientside
*
uint currentZoneID;
if (client != null)
{
currentZoneID = client.getActor().zoneId;
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mConnectedPlayerList)
{
// Change the weather for everyone in the same zone
if (currentZoneID == entry.Value.getActor().zoneId)
{
BasePacket weatherPacket = BasePacket.createPacket(SetWeatherPacket.buildPacket(entry.Value.actorID, weather), true, false);
entry.Value.queuePacket(weatherPacket);
}
}
}
*/
}
/// <summary>
/// We only use the default options for SendMessagePacket.
/// May as well make it less unwieldly to view
@ -525,12 +553,49 @@ namespace FFXIVClassic_Lobby_Server
else if (split[1].Equals("setgraphic"))
sendMessage(client, Resources.CPsetgraphic);
*/
}
if (split.Length == 3)
{
if(split[1].Equals("test"))
{
if (split[2].Equals("weather"))
sendMessage(client, Resources.CPtestweather);
}
}
return true;
}
#endregion
#region !test
else if (split[0].Equals("test"))
{
if (split.Length == 1)
{
// catch invalid commands
sendMessage(client, Resources.CPhelp);
}
else if (split.Length >= 2)
{
#region !test weather
if (split[1].Equals("weather"))
{
try
{
doWeather(client, split[2], split[3]);
return true;
}
catch (Exception e)
{
Log.error("Could not change weather: " + e);
}
}
#endregion
}
}
#endregion
#region !mypos
else if (split[0].Equals("mypos"))
{

View file

@ -64,7 +64,7 @@ namespace FFXIVClassic_Map_Server.Properties {
/// Looks up a localized string similar to Adds the specified currency to the current player&apos;s inventory
///
///*Syntax: givecurrency &lt;quantity&gt;
/// givecurrency &lt;quantity&gt; &lt;type&gt;
/// givecurrency &lt;type&gt; &lt;quantity&gt;
///&lt;type&gt; is the specific type of currency desired, defaults to gil if no type specified.
/// </summary>
public static string CPgivecurrency {
@ -105,7 +105,8 @@ namespace FFXIVClassic_Map_Server.Properties {
///
///Available commands:
///Standard: mypos, music, warp
///Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, removekeyitem, reloaditems, reloadzones.
///Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, removekeyitem, reloaditems, reloadzones
///Test: test weather.
/// </summary>
public static string CPhelp {
get {
@ -117,7 +118,7 @@ namespace FFXIVClassic_Map_Server.Properties {
/// Looks up a localized string similar to Changes the currently playing background music
///
///*Syntax: music &lt;music id&gt;
///&lt;music id&gt; is the key item&apos;s specific id as defined in the server database.
///&lt;music id&gt; is the music&apos;s specific id as defined in the client.
/// </summary>
public static string CPmusic {
get {
@ -176,7 +177,7 @@ namespace FFXIVClassic_Map_Server.Properties {
/// Looks up a localized string similar to Removes the specified currency from the current player&apos;s inventory
///
///*Syntax: removecurrency &lt;quantity&gt;
/// removecurrency &lt;quantity&gt; &lt;type&gt;
/// removecurrency &lt;type&gt; &lt;quantity&gt;
///&lt;type&gt; is the specific type of currency desired, defaults to gil if no type specified.
/// </summary>
public static string CPremovecurrency {
@ -236,6 +237,18 @@ namespace FFXIVClassic_Map_Server.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Changes the current weather
///
///*Syntax: test weather &lt;weather id&gt;
///&lt;weather id&gt; is the weather&apos;s specific id as defined in the client.
/// </summary>
public static string CPtestweather {
get {
return ResourceManager.GetString("CPtestweather", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Teleports the player to the specified location
///

View file

@ -121,7 +121,7 @@
<value>Adds the specified currency to the current player's inventory
*Syntax: givecurrency &lt;quantity&gt;
givecurrency &lt;quantity&gt; &lt;type&gt;
givecurrency &lt;type&gt; &lt;quantity&gt;
&lt;type&gt; is the specific type of currency desired, defaults to gil if no type specified</value>
</data>
<data name="CPgiveitem" xml:space="preserve">
@ -144,13 +144,14 @@
Available commands:
Standard: mypos, music, warp
Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, removekeyitem, reloaditems, reloadzones</value>
Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, removekeyitem, reloaditems, reloadzones
Test: test weather</value>
</data>
<data name="CPmusic" xml:space="preserve">
<value>Changes the currently playing background music
*Syntax: music &lt;music id&gt;
&lt;music id&gt; is the key item's specific id as defined in the server database</value>
&lt;music id&gt; is the music's specific id as defined in the client</value>
</data>
<data name="CPmypos" xml:space="preserve">
<value>Prints out your current location
@ -173,7 +174,7 @@ Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, remo
<value>Removes the specified currency from the current player's inventory
*Syntax: removecurrency &lt;quantity&gt;
removecurrency &lt;quantity&gt; &lt;type&gt;
removecurrency &lt;type&gt; &lt;quantity&gt;
&lt;type&gt; is the specific type of currency desired, defaults to gil if no type specified</value>
</data>
<data name="CPremoveitem" xml:space="preserve">
@ -202,6 +203,12 @@ Server Administration: givecurrency, giveitem, givekeyitem, removecurrency, remo
*Syntax: sendpacket &lt;slot&gt; &lt;wid&gt; &lt;eid&gt; &lt;vid&gt; &lt;cid&gt;
&lt;w/e/v/c id&gt; are as defined in the client game data</value>
</data>
<data name="CPtestweather" xml:space="preserve">
<value>Changes the current weather
*Syntax: test weather &lt;weather id&gt;
&lt;weather id&gt; is the weather's specific id as defined in the client</value>
</data>
<data name="CPwarp" xml:space="preserve">
<value>Teleports the player to the specified location

View file

@ -479,7 +479,7 @@ namespace FFXIVClassic_Map_Server.Actors
queuePacket(SetActorIsZoningPacket.buildPacket(actorId, actorId, false));
queuePacket(_0x10Packet.buildPacket(actorId, 0xFF));
queuePacket(SetMusicPacket.buildPacket(actorId, zone.bgmDay, 0x01));
queuePacket(SetWeatherPacket.buildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR));
queuePacket(SetWeatherPacket.buildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1));
queuePacket(SetMapPacket.buildPacket(actorId, zone.regionId, zone.actorId));
@ -522,6 +522,7 @@ namespace FFXIVClassic_Map_Server.Actors
BasePacket areaMasterSpawn = zone.getSpawnPackets(actorId);
BasePacket debugSpawn = world.GetDebugActor().getSpawnPackets(actorId);
BasePacket worldMasterSpawn = world.GetActor().getSpawnPackets(actorId);
BasePacket weatherDirectorSpawn = new WeatherDirector(this, 8003).getSpawnPackets(actorId);
BasePacket directorSpawn = null;
if (currentDirector != null)
@ -550,6 +551,9 @@ namespace FFXIVClassic_Map_Server.Actors
packet.debugPrintSubPacket();
queuePacket(packet);
}
playerSession.queuePacket(weatherDirectorSpawn);
/*
#region hardcode
BasePacket reply10 = new BasePacket("./packets/login/login10.bin"); //Item Storage, Inn Door created

View file

@ -21,9 +21,11 @@ namespace FFXIVClassic_Map_Server.Actors
this.weatherId = weatherId;
this.displayNameId = 0;
this.customDisplayName = String.Format("weatherDire_{0}", zone.zoneName, zone.actorId);
this.actorName = String.Format("weatherDire_{0}@{0:04x}", zone.zoneName, zone.actorId);
this.customDisplayName = String.Format("weatherDire_{0}_{1}", player.zone.zoneName, "07");
this.actorName = String.Format("weatherDire_{0}_{1}@{2:x3}{3:x2}", player.zone.zoneName, "04", player.zoneId, 0);
this.className = "Debug";
}

View file

@ -26,9 +26,9 @@ namespace FFXIVClassic_Map_Server.lua
player.playerSession.queuePacket(SetMusicPacket.buildPacket(player.actorId, musicID, playMode), true, false);
}
public void setWeather(uint weatherID)
public void setWeather(ushort weatherID)
{
player.playerSession.queuePacket(SetWeatherPacket.buildPacket(player.actorId, weatherID), true, false);
player.playerSession.queuePacket(SetWeatherPacket.buildPacket(player.actorId, weatherID, 1), true, false);
}
public void getParameter(string paramName)

View file

@ -1,43 +1,49 @@
using FFXIVClassic_Lobby_Server.packets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.packets.send
{
class SetWeatherPacket
{
//TODO: Fix these ids!
public const uint WEATHER_CLEAR = 0x011F41;
public const uint WEATHER_FINE = 0x011F42;
public const uint WEATHER_CLOUDY = 0x011F3;
public const uint WEATHER_FOGGY = 0x011F4;
public const uint WEATHER_WINDY = 0x011F5; //NOT SUPPORTED in v1.23
public const uint WEATHER_BLUSTERY = 0x011F6;
public const uint WEATHER_RAINY = 0x011F7;
public const uint WEATHER_SHOWERY = 0x011F8; //NOT SUPPORTED in v1.23
public const uint WEATHER_THUNDERY = 0x011F9; //NOT SUPPORTED in v1.23
public const uint WEATHER_STORMY = 0x011FA;
public const uint WEATHER_DUSTY = 0x011FB; //NOT SUPPORTED in v1.23
public const uint WEATHER_SANDY = 0x011FC;
public const uint WEATHER_IFRIT = 0x011F4E;
public const uint WEATHER_GARUDA = 0x011F5C;
public const uint WEATHER_BLISTERIN = 0x011FD; //NOT SUPPORTED in v1.23
public const uint WEATHER_SNOWY = 0x011FE; //NOT SUPPORTED in v1.23
public const uint WEATHER_WINTRY = 0x011FF; //NOT SUPPORTED in v1.23
public const uint WEATHER_GLOOMY = 0x01200;
public const uint WEATHER_PREDALAMUD = 0x011F5F;
public const uint WEATHER_DALAMUD = 0x011F5E;
public const uint WEATHER_SCARYDALAMUD = 0x011F60;
public const ushort OPCODE = 0x000D;
public const uint PACKET_SIZE = 0x28;
public static SubPacket buildPacket(uint playerActorID, long weatherId)
{
return new SubPacket(OPCODE, 0, playerActorID, BitConverter.GetBytes(weatherId));
}
}
}
using FFXIVClassic_Lobby_Server.packets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.packets.send
{
class SetWeatherPacket
{
public const ushort WEATHER_CLEAR = 8001;
public const ushort WEATHER_FAIR = 8002;
public const ushort WEATHER_CLOUDY = 8003;
public const ushort WEATHER_FOGGY = 8004;
public const ushort WEATHER_WINDY = 8005;
public const ushort WEATHER_BLUSTERY = 8006;
public const ushort WEATHER_RAINY = 8007;
public const ushort WEATHER_SHOWERY = 8008;
public const ushort WEATHER_THUNDERY = 8009;
public const ushort WEATHER_STORMY = 8010;
public const ushort WEATHER_DUSTY = 8011;
public const ushort WEATHER_SANDY = 8012;
public const ushort WEATHER_HOT = 8013;
public const ushort WEATHER_BLISTERING = 8014; //Bowl Of Embers Weather
public const ushort WEATHER_SNOWY = 8015;
public const ushort WEATHER_WINTRY = 8016;
public const ushort WEATHER_GLOOMY = 8017;
public const ushort WEATHER_SEASONAL = 8027; //Snow in Black Shroud, nothing elsewhere
public const ushort WEATHER_PRIMAL = 8028; //Howling Eye and Thornmarch Weather
public const ushort WEATHER_SEASONAL_FIREWORKS = 8029; //Plays fireworks between 20:00 - 21:00 ET
public const ushort WEATHER_DALAMUD = 8030;
public const ushort WEATHER_AURORA = 8031;
public const ushort WEATHER_DALAMUD_THUNDER = 8032;
public const ushort WEATHER_DAY = 8065; //Force skybox to show Day + Fair regardless of current ET
public const ushort WEATHER_TWILIGHT = 8066; //Force skybox to show Twilight + Clear regardless of current ET
public const ushort OPCODE = 0x000D;
public const uint PACKET_SIZE = 0x28;
public static SubPacket buildPacket(uint playerActorID, ushort weatherId, ushort transitionTime)
{
ulong combined = (ulong)(weatherId | (transitionTime << 16));
return new SubPacket(OPCODE, 0, playerActorID, BitConverter.GetBytes(combined));
}
}
}