public static void PlayerJump(MsgAction action, GameState client)
{
if (client.Player.Dead || client.Player.ContainsFlag(((ulong)MsgUpdate.Flags.Dead)) || client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Ghost))
{
return;
}
if (client.ProgressBar != null)
client.ProgressBar.End(client);
client.Player.KillCount2 = 0;
client.Player.SpiritFocus = false;
ushort oldX = client.Player.X;
ushort oldY = client.Player.Y;
client.Player.RemoveFlag((ulong)MsgUpdate.Flags.Intensify);
client.Player.IntensifyPercent = 0;
if (client.Player.OnCheckGuard)
{
client.Player.OnCheckGuard = false;
client.MessageBox("Unable~to~check!", null, null, 0);
DialyQuestsEffect.CheckCancelGuard(client);
client.Player.CheckGuardSec = 0;
}
if (client.Team == null)
{
if (client.Player.SpookMap != null && client.Player.MapID == client.Player.SpookMap.ID && Kernel.GetDistance(client.Player.X, client.Player.Y, 36, 24) < 25)
{
((INpc)new NpcSpawn
{
UID = 8798,
Mesh = 7610,
Type = Enums.NpcType.Talker,
X = 36,
Y = 24,
MapID = client.Player.MapID
}).SendSpawn(client);
((INpc)new NpcSpawn
{
UID = 8308,
Mesh = 2507,
Type = Enums.NpcType.Talker,
X = 25,
Y = 30,
MapID = client.Player.MapID
}).SendSpawn(client);
}
}
else
{
if (client.Team.SpookMap != null && client.Player.MapID == client.Team.SpookMap.ID && Kernel.GetDistance(client.Player.X, client.Player.Y, 36, 24) < 25)
{
((INpc)new NpcSpawn
{
UID = 8798,
Mesh = 7610,
Type = Enums.NpcType.Talker,
X = 36,
Y = 24,
MapID = client.Player.MapID
}).SendSpawn(client);
((INpc)new NpcSpawn
{
UID = 8308,
Mesh = 2507,
Type = Enums.NpcType.Talker,
X = 25,
Y = 30,
MapID = client.Player.MapID
}).SendSpawn(client);
}
}
if (client.Player.MapID == 4000 && client.Player.X == 40 && client.Player.Y == 66)
{
client.MessageBox("Do you want to leave the Tower of Mystery?",
(p) =>
{
client.Player.Teleport(4020, 86, 74);
client.Player.Update(MsgName.Mode.Effect, "zf2-e300", true);
});
}
if (client.Player.MapID == 3846||client.Player.MapID == 10137 && Kernel.SpawnNemesis2)
{
foreach (INpc Npc in client.Map.Npcs.Values)
{
if (Npc.MapID == 10137 && (Npc.UID == 3080) && Kernel.GetDistance(client.Player.X, client.Player.Y, Npc.X, Npc.Y) < 17)
{
Npc.SendSpawn(client);
}
}
}
if (client.Player.MapID == 10137 && Kernel.SpawnBanshee2)
{
foreach (INpc Npc in client.Map.Npcs.Values)
{
if (Npc.MapID == 1927 && (Npc.UID == 2999) && Kernel.GetDistance(client.Player.X, client.Player.Y, Npc.X, Npc.Y) < 17)
{
Npc.SendSpawn(client);
}
}
}
client.Player.Action = Enums.ConquerAction.None;
client.Mining = false;
if (client.Player.ContainsFlag((ulong)MsgUpdate.Flags.CastPray))
{
client.Player.RemoveFlag((ulong)MsgUpdate.Flags.CastPray);
foreach (var Client in client.Prayers)
{
if (Client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Praying))
{
Client.Player.RemoveFlag((ulong)MsgUpdate.Flags.Praying);
}
}
client.Prayers.Clear();
}
if (client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Praying))
{
client.Player.RemoveFlag((ulong)MsgUpdate.Flags.Praying);
client.PrayLead = null;
}
Time32 Now = Time32.Now;
client.Attackable = true;
if (client.Player.AttackPacket != null)
{
client.Player.AttackPacket = null;
}
if (client.Player.Dead)
{
if (Now > client.Player.DeathStamp.AddSeconds(4))
{
client.Disconnect();
return;
}
}
ushort new_X = BitConverter.ToUInt16(action.ToArray(), 12);
ushort new_Y = BitConverter.ToUInt16(action.ToArray(), 14);
if (client.Player.MapID == 1700 && client.Player.X == 595 && client.Player.Y == 640)
{
client.Player.Teleport(1036, 215, 215);
}
#region Jump Failed MapID 1038 / Twin
/* if (client.Player.MapID == 1038)
{
if (!(client.Player.X < 224 && client.Player.X > 3 && client.Player.Y < 211 && client.Player.Y > 3))
{
if (new_X < 224 && new_Y < 211)
{
if (Kernel.GetDistance(client.Player.X, client.Player.Y, Game.GuildWar.LeftGate.X, Game.GuildWar.LeftGate.Y) < Kernel.GetDistance(client.Player.X, client.Player.Y, Game.GuildWar.RightGate.X, Game.GuildWar.RightGate.Y) ||
Kernel.GetDistance(client.Player.X, client.Player.Y, Game.SuperGuildWar.LeftGate.X, Game.SuperGuildWar.LeftGate.Y) < Kernel.GetDistance(client.Player.X, client.Player.Y, Game.SuperGuildWar.RightGate.X, Game.SuperGuildWar.RightGate.Y))
{
if (Game.GuildWar.LeftGate.Mesh == (ushort)(240 + Game.GuildWar.LeftGate.Mesh % 10) ||
Game.SuperGuildWar.LeftGate.Mesh == (ushort)(240 + Game.SuperGuildWar.LeftGate.Mesh % 10))
{
client.Player.Teleport(client.Player.X, client.Player.Y);
client.Send(new MsgTalk("Invalid Jump!", Color.Red, MsgTalk.Talk));
return;
}
}
else
{
if (Game.GuildWar.RightGate.Mesh == (ushort)(270 + Game.GuildWar.RightGate.Mesh % 10) ||
Game.SuperGuildWar.RightGate.Mesh == (ushort)(270 + Game.SuperGuildWar.RightGate.Mesh % 10))
{
client.Player.Teleport(client.Player.X, client.Player.Y);
client.Send(new MsgTalk("Invalid Jump!", Color.Red, MsgTalk.Talk));
return;
}
}
}
}
} */
/*if (client.Player.MapID == 1002)
{
if (new_X == 310 && new_Y == 277)
{
if (client.Player.EntityFlag == Game.EntityFlag.Player)
{
_String str = new _String(true);
str.UID = client.Player.UID;
str.TextsCount = 1;
str.Type = _String.Effect;
str.Texts.Add("firemagic");
client.SendScreen(str, true);
}
}
} */
#endregion
if (client.lastJumpDistance == 0) goto Jump;
if (client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Ride))
{
int distance = Kernel.GetDistance(new_X, new_Y, client.Player.X, client.Player.Y);
ushort take = (ushort)(1.5F * (distance / 2));
if (client.Vigor >= take)
{
client.Vigor -= take;
Vigor vigor = new Vigor(true);
vigor.Amount = client.Vigor;
vigor.Send(client);
}
else
{
}
}
#region Cheak Speed Hack
client.LastJumpTime = (int)Kernel.maxJumpTime(client.lastJumpDistance);
var serverstamp = Now.GetHashCode() - client.lastJumpTime.GetHashCode();
var clientstamp = action.TimeStamp.GetHashCode() - client.lastClientJumpTime.GetHashCode();
var speed = clientstamp - serverstamp;
if (speed > 100)
{
client.speedHackSuspiction++;
if (!client.Player.OnCyclone() && !client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Ride) && !client.Player.OnOblivion() && !client.Player.OnSuperman() && !client.Player.ContainsFlag3((ulong)MsgUpdate.Flags3.DragonCyclone) && !client.Player.OnSuperCyclone() && !client.Player.Transformed && client.speedHackSuspiction >= 3)
{
client.Disconnect();
}
}
else
{
client.speedHackSuspiction = Math.Max(0, client.speedHackSuspiction - 1);
}
#endregion
if (Now < client.lastJumpTime.AddMilliseconds(client.LastJumpTime))
{
bool doDisconnect = false;
if (client.Player.Transformed)
if (client.Player.TransformationID != 207 && client.Player.TransformationID != 267)
doDisconnect = true;
if (client.Player.Transformed && doDisconnect)
{
}
if (client.Player.Transformed && !doDisconnect)
{
goto Jump;
}
if (!client.Player.OnCyclone() && !client.Player.ContainsFlag3((ulong)MsgUpdate.Flags3.DragonCyclone) && !client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Ride) && client.speedHackSuspiction >= 2)
{
// client.Disconnect();
}
else if (client.Player.ContainsFlag((ulong)MsgUpdate.Flags.Ride))
{
int time = (int)Kernel.maxJumpTime(client.lastJumpDistance);
int speedprc = Database.DataHolder.SteedSpeed(client.Equipment.TryGetItem(MsgItemInfo.Steed).Plus);
if (speedprc != 0)
{
if (Now < client.lastJumpTime.AddMilliseconds(time - (time * speedprc / 100)))
{
//client.Player.Shift(client.Player.X, client.Player.Y);
//return;
}
}
else
{
//client.Player.Shift(client.Player.X, client.Player.Y);
//return;
}
}
}
Jump:
client.lastJumpDistance = Kernel.GetDistance(new_X, new_Y, client.Player.X, client.Player.Y);
client.lastClientJumpTime = action.TimeStamp;
client.lastJumpTime = Now;
Game.Map Map = client.Map;
if (Map != null)
{
if (Map.Floor[new_X, new_Y, Game.MapObjectType.Player, null])
{
if (Kernel.GetDistance(new_X, new_Y, client.Player.X, client.Player.Y) <= 20)
{
client.Player.Action = Game.Enums.ConquerAction.Jump;
client.Player.Facing = Kernel.GetAngle(action.X, action.Y, new_X, new_Y);
client.Player.PX = client.Player.X;
client.Player.PY = client.Player.Y;
client.Player.X = new_X;
client.Player.Y = new_Y;
if (client.Player.MapID == MsgWarFlag.MapID)
CheckForFlag(client);
client.SendScreen(action, true);
client.Screen.Reload(action);
if (client.Player.InteractionInProgress && client.Player.InteractionSet)
{
if (client.Player.Body == 1003 || client.Player.Body == 1004)
{
if (Kernel.GamePool.ContainsKey(client.Player.InteractionWith))
{
GameState ch = Kernel.GamePool[client.Player.InteractionWith];
Network.GamePackets.MsgAction general = new Network.GamePackets.MsgAction(true);
general.UID = ch.Player.UID;
general.X = new_X;
general.Y = new_Y;
general.ID = (MsgAction.Mode)156;
ch.Send(general.ToArray());
ch.Player.Action = Game.Enums.ConquerAction.Jump;
ch.Player.X = new_X;
ch.Player.Y = new_Y;
ch.Player.Facing = Kernel.GetAngle(ch.Player.X, ch.Player.Y, new_X, new_Y);
ch.SendScreen(action, true);
ch.Screen.Reload(general);
client.SendScreen(action, true);
client.Screen.Reload(general);
}
}
}
}
else
{
client.Disconnect();
}
}
else
{
if (client.Player.Mode == Game.Enums.Mode.None)
{
client.Player.Teleport(client.Map.ID, client.Player.X, client.Player.Y);
}
}
}
else
{
if (Kernel.GetDistance(new_X, new_Y, client.Player.X, client.Player.Y) <= 20)
{
client.Player.Action = Game.Enums.ConquerAction.Jump;
client.Player.Facing = Kernel.GetAngle(action.X, action.Y, new_X, new_Y);
client.Player.X = new_X;
client.Player.Y = new_Y;
client.SendScreen(action, true);
client.Screen.Reload(action);
}
else
{
client.Disconnect();
}
}
#region DragonIsland
/*if (client.Player.MapID == 10137)
{
var floor = Database.FloorItemTable.FloorItems.Where(i => i.ItemID == 1675 && i.MapID == 10137).FirstOrDefault();
if (oldX <= floor.X && client.Player.X > floor.X && Kernel.GetDistance(client.Player.X, client.Player.Y, floor.X, floor.Y) < 16)
{
client.Player.DragonIslandAttackable = true;
}
if (oldX >= floor.X && client.Player.X < floor.X && Kernel.GetDistance(client.Player.X, client.Player.Y, floor.X, floor.Y) < 16)
{
client.Player.DragonIslandAttackable = false;
}
floor = Database.FloorItemTable.FloorItems.Where(i => i.ItemID == 1674 && i.MapID == 10137).FirstOrDefault();
if (oldX <= floor.X && client.Player.X > floor.X && Kernel.GetDistance(client.Player.X, client.Player.Y, floor.X, floor.Y) < 16)
{
client.Player.DragonIslandAttackable = true;
}
if (oldX >= floor.X && client.Player.X < floor.X && Kernel.GetDistance(client.Player.X, client.Player.Y, floor.X, floor.Y) < 16)
{
client.Player.DragonIslandAttackable = false;
}
} */
#endregion
if (client.Map.BaseID == 1038 && Game.GuildWar.IsWar || client.Player.MapID == 1234 && Game.SuperGuildWar.IsWar)
{
Game.Calculations.IsBreaking(client, oldX, oldY);
}
if (!client.Player.HasMagicDefender)
{
if (client.Team != null)
{
var owners = client.Team.Teammates.Where(x => x.Player.MagicDefenderOwner);
if (owners != null)
{
foreach (var owner in owners)
{
if (Kernel.GetDistance(client.Player.X, client.Player.Y, owner.Player.X, owner.Player.Y) <= 4)
{
client.Player.HasMagicDefender = true;
client.Player.MagicDefenderStamp = Time32.Now;
client.Player.MagicDefenderSecs = (byte)(owner.Player.MagicDefenderStamp.AddSeconds(owner.Player.MagicDefenderSecs) - owner.Player.MagicDefenderStamp).AllSeconds();
client.Player.AddFlag3((ulong)MsgUpdate.Flags3.MagicDefender);
MsgUpdate upgrade = new MsgUpdate(true);
upgrade.UID = client.Player.UID;
upgrade.Append((byte)MsgUpdate.DataType.AzureShield, 128, client.Player.MagicDefenderSecs, 0, 0);
client.Send(upgrade.ToArray());
break;
}
}
}
}
}
else
{
client.Player.RemoveMagicDefender();
}
}