- Joined
- Sep 10, 2007
- Messages
- 970
- Reaction score
- 815
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Viral
{
class DeathMatchLogic : IBattleLogic
{
public void OnBattleInitialStart(Client client) {
client.Stage.State = StageState.Standby;
client.Stage.RoundState = RoundState.Prepare;
client.Stage.Team1Score = 0;
client.Stage.Team2Score = 0;
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet2 = new Packet(Operation.StageLaunch);
packet2.Write(client.Stage.ID);
packet2.Write(client.Stage.MapName);
foreach (Client c in clients)
{
Helper.RegisterGenericBattleCallbacks(c);
c.KillCount = 0;
c.DeathCount = 0;
c.InBattle = true;
c.EnteredBattle = false;
c.RequestedBattleInfo = false;
c.Alive = false;
// c.Send(packet); /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
c.Send(packet2);
}
}
public void OnBattleJoin(Client client) {
client.InBattle = true;
client.Alive = false;
client.LateJoin = true;
// check state // maybe set a bool marking them as a newbie
CheckBattleState(client);
}
public void OnBattleLeave(Client client) {
List<Client> clis = null;
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
pStageLeaveBattle.Write(client.SessionID);
pStageLeaveBattle.Write(client.Stage.ID);
foreach (Client cli in clis)
cli.Send(pStageLeaveBattle);
client.InBattle = false;
client.EnteredBattle = false;
client.RequestedBattleInfo = false;
client.Alive = false;
Helper.UnregisterAllBattleCallbacks(client);
CheckBattleState(client);
}
public void OnBattleKill(Client client, Client killer) {
client.Alive = false;
List<Client> clis = null;
Packet packetdead = new Packet(Operation.GameDead);
packetdead.Write(killer.SessionID);
packetdead.Write((UInt32)0x0);
packetdead.Write(client.SessionID);
packetdead.Write((UInt32)0x0);
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
foreach (Client cli in clis)
cli.Send(packetdead);
client.DeathCount++;
client.RoundDeaths++;
if (killer.SessionID != client.SessionID)
{
killer.KillCount++;
killer.RoundKills++;
}
CheckBattleState(client);
// check win state.
}
public void OnBattleSuicide(Client client) {
}
public void OnBattleLoaded(Client client) {
List<Client> clients = null;
lock (client.Stage.Clients)
clients = new List<Client>(client.Stage.Clients);
client.Loaded = true;
Packet packet = new Packet(Operation.StageLoaded);
packet.Write(client.SessionID);
packet.Write((UInt32)0x64);
foreach (Client cli in clients)
cli.Send(packet);
CheckBattleState(client);
}
public void OnBattleInfoRequest(Client client) {
client.RequestedBattleInfo = true;
if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
{
}
CheckBattleState(client);
}
public void OnBattleEnterRequest(Client client) {
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet = new Packet(Operation.StageEnterBattleResponse);
if (client.Stage.State == StageState.Standby)
packet.Write(Convert.ToByte(0));
else
packet.Write(Convert.ToByte(1));
packet.Write(166, 1);
/* possible loop entire client stage list in one packet */
Client c = client;
packet.Write(c.SessionID);
if (c.Bridge != null)
{
packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
packet.Write(c.Bridge.Port);
}
else
{
packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
packet.Write((int)0x00);
}
packet.Write(c.Character.Name, 32);
packet.Write(c.Character.ClanName, 16);
packet.Write((Int32)c.Character.ClanRank);
packet.Write(c.Character.ClanPoints);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(c.Character.Level));
packet.Write((byte)c.Character.Gender);
packet.Write((byte)c.Character.Hair);
packet.Write((byte)c.Character.Face);
packet.Write(c.Character.Experience);
packet.Write(c.Character.Bounty);
packet.Write(c.Character.Bonus);
packet.Write(c.Character.Prize);
packet.Write(c.Character.Health);
packet.Write(c.Character.Armor);
packet.Write(c.Character.MaxWeight);
packet.Write(c.Character.SafeFalls);
packet.Write(c.Character.FR);
packet.Write(c.Character.CR);
packet.Write(c.Character.ER);
packet.Write(c.Character.WR);
foreach (Int32 rentalid in c.Character.Equipment)
{
if (rentalid == 0) packet.Write((Int32)0);
else packet.Write(c.Character.Inventory[rentalid].ItemID);
}
packet.Write((Int32)c.Account.Access);
packet.Write(c.Character.ClanID);
packet.Write((byte)c.Team);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(0));
foreach (Client cli in clients)
cli.Send(packet);
client.EnteredBattle = true;
// Check round state
if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
{
// taking this out leaves them zoomed around the map.
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(0));
client.Send(packet);
}
client.LateJoin = false;
CheckBattleState(client);
}
private void CheckBattleState(Client client)
{
List<Client> clients = null;
lock(client.Stage.Clients)
clients = client.Stage.Clients.ToList();
if (client.Stage.State == StageState.Standby) { // Initial round not yet loaded
if (client.Stage.RoundState == RoundState.Prepare && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
{
client.Stage.State = StageState.Run;
client.Stage.RoundState = RoundState.Play;
foreach (Client cli in clients)
{
cli.RequestedBattleInfo = false;
cli.Alive = true;
}
Helper.UpdateChannelStages(client.Channel,null);
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients)
c.Send(packet);
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
else if (client.Stage.State == StageState.Run) { // Game Running
if (client.Stage.RoundState == RoundState.Prepare)
{
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Prepare", client.Stage.ID);
return;
}
else if (client.Stage.RoundState == RoundState.Countdown) {
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Countdown", client.Stage.ID);
return;
}
else if (client.Stage.RoundState == RoundState.Play) {
CheckWinCondition(client);
return;
}
}
}
private void CheckWinCondition(Client client)
{
Stage stage = client.Stage;
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
if (stage.RoundState == RoundState.Play)
{
List<Client> clis = null;
lock (stage.Clients)
clis = stage.Clients.FindAll(c => c.InBattle == true);
bool GameOver = false;
foreach (Client cli in clis)
{
if (cli.RoundKills >= stage.Rounds)
{
GameOver = true;
break;
}
}
if (GameOver == true)
{
stage.CurrentRound = 0;
stage.Team1Score = 0;
stage.Team2Score = 0;
stage.State = StageState.Standby;
stage.RoundState = RoundState.Prepare;
Packet pGameOver = new Packet(Operation.BattleRoundStateUpdate);
pGameOver.Write(stage.ID);
pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
pGameOver.Write((Int32)RoundState.Finish);
pGameOver.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
cli.Send(pGameOver);
pGameOver = new Packet(Operation.BattleRoundStateUpdate);
pGameOver.Write(stage.ID);
pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
pGameOver.Write((Int32)RoundState.Exit);
pGameOver.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
cli.Send(pGameOver);
pGameOver = new Packet(Operation.StageFinish);
pGameOver.Write(stage.ID);
foreach (Client cli in clis)
cli.Send(pGameOver);
foreach (Client cli in clis)
{
cli.InBattle = false;
cli.Alive = false;
cli.RequestedBattleInfo = false;
cli.RoundDeaths = 0;
cli.RoundKills = 0;
}
}
}
}
}
class GladiatorMatchLogic : IBattleLogic
{
public void OnBattleInitialStart(Client client)
{
client.Stage.State = StageState.Standby;
client.Stage.RoundState = RoundState.Prepare;
client.Stage.Team1Score = 0;
client.Stage.Team2Score = 0;
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet2 = new Packet(Operation.StageLaunch);
packet2.Write(client.Stage.ID);
packet2.Write(client.Stage.MapName);
foreach (Client c in clients)
{
Helper.RegisterGenericBattleCallbacks(c);
c.KillCount = 0;
c.DeathCount = 0;
c.InBattle = true;
c.EnteredBattle = false;
c.RequestedBattleInfo = false;
c.Alive = false;
// c.Send(packet); /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
c.Send(packet2);
}
}
public void OnBattleJoin(Client client)
{
client.InBattle = true;
client.Alive = false;
client.LateJoin = true;
// check state // maybe set a bool marking them as a newbie
CheckBattleState(client);
}
public void OnBattleLeave(Client client)
{
List<Client> clis = null;
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
pStageLeaveBattle.Write(client.SessionID);
pStageLeaveBattle.Write(client.Stage.ID);
foreach (Client cli in clis)
cli.Send(pStageLeaveBattle);
client.InBattle = false;
client.EnteredBattle = false;
client.RequestedBattleInfo = false;
client.Alive = false;
Helper.UnregisterAllBattleCallbacks(client);
CheckBattleState(client);
}
public void OnBattleKill(Client client, Client killer)
{
client.Alive = false;
List<Client> clis = null;
Packet packetdead = new Packet(Operation.GameDead);
packetdead.Write(killer.SessionID);
packetdead.Write((UInt32)0x0);
packetdead.Write(client.SessionID);
packetdead.Write((UInt32)0x0);
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
foreach (Client cli in clis)
cli.Send(packetdead);
client.DeathCount++;
client.RoundDeaths++;
if (killer.SessionID != client.SessionID)
{
killer.KillCount++;
killer.RoundKills++;
}
CheckBattleState(client);
// check win state.
}
public void OnBattleSuicide(Client client)
{
}
public void OnBattleLoaded(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = new List<Client>(client.Stage.Clients);
client.Loaded = true;
Packet packet = new Packet(Operation.StageLoaded);
packet.Write(client.SessionID);
packet.Write((UInt32)0x64);
foreach (Client cli in clients)
cli.Send(packet);
CheckBattleState(client);
}
public void OnBattleInfoRequest(Client client)
{
client.RequestedBattleInfo = true;
if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
{
}
CheckBattleState(client);
}
public void OnBattleEnterRequest(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet = new Packet(Operation.StageEnterBattleResponse);
if (client.Stage.State == StageState.Standby)
packet.Write(Convert.ToByte(0));
else
packet.Write(Convert.ToByte(1));
packet.Write(166, 1);
/* possible loop entire client stage list in one packet */
Client c = client;
packet.Write(c.SessionID);
if (c.Bridge != null)
{
packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
packet.Write(c.Bridge.Port);
}
else
{
packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
packet.Write((int)0x00);
}
packet.Write(c.Character.Name, 32);
packet.Write(c.Character.ClanName, 16);
packet.Write((Int32)c.Character.ClanRank);
packet.Write(c.Character.ClanPoints);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(c.Character.Level));
packet.Write((byte)c.Character.Gender);
packet.Write((byte)c.Character.Hair);
packet.Write((byte)c.Character.Face);
packet.Write(c.Character.Experience);
packet.Write(c.Character.Bounty);
packet.Write(c.Character.Bonus);
packet.Write(c.Character.Prize);
packet.Write(c.Character.Health);
packet.Write(c.Character.Armor);
packet.Write(c.Character.MaxWeight);
packet.Write(c.Character.SafeFalls);
packet.Write(c.Character.FR);
packet.Write(c.Character.CR);
packet.Write(c.Character.ER);
packet.Write(c.Character.WR);
foreach (Int32 rentalid in c.Character.Equipment)
{
if (rentalid == 0) packet.Write((Int32)0);
else if (rentalid == (Int32)RentalSlot.PrimaryWeapon - 1 || rentalid == (Int32)RentalSlot.SecondaryWeapon - 1 ||
rentalid == (Int32)RentalSlot.Custom1 - 1 || rentalid == (Int32)RentalSlot.Custom2 - 1) packet.Write((Int32)0);
else packet.Write(c.Character.Inventory[rentalid].ItemID);
}
packet.Write((Int32)c.Account.Access);
packet.Write(c.Character.ClanID);
packet.Write((byte)c.Team);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(0));
foreach (Client cli in clients)
cli.Send(packet);
client.EnteredBattle = true;
// Check round state
if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
{
// taking this out leaves them zoomed around the map.
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(0));
client.Send(packet);
}
client.LateJoin = false;
CheckBattleState(client);
}
private void CheckBattleState(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = client.Stage.Clients.ToList();
if (client.Stage.State == StageState.Standby)
{ // Initial round not yet loaded
if (client.Stage.RoundState == RoundState.Prepare && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
{
client.Stage.State = StageState.Run;
client.Stage.RoundState = RoundState.Play;
foreach (Client cli in clients)
{
cli.RequestedBattleInfo = false;
cli.Alive = true;
}
Helper.UpdateChannelStages(client.Channel, null);
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients)
c.Send(packet);
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
else if (client.Stage.State == StageState.Run)
{ // Game Running
if (client.Stage.RoundState == RoundState.Prepare)
{
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Prepare", client.Stage.ID);
return;
}
else if (client.Stage.RoundState == RoundState.Countdown)
{
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Countdown", client.Stage.ID);
return;
}
else if (client.Stage.RoundState == RoundState.Play)
{
CheckWinCondition(client);
return;
}
}
}
private void CheckWinCondition(Client client)
{
Stage stage = client.Stage;
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
if (stage.RoundState == RoundState.Play)
{
List<Client> clis = null;
lock (stage.Clients)
clis = stage.Clients.FindAll(c => c.InBattle == true);
bool GameOver = false;
foreach (Client cli in clis)
{
if (cli.RoundKills >= stage.Rounds)
{
GameOver = true;
break;
}
}
if (GameOver == true)
{
stage.CurrentRound = 0;
stage.Team1Score = 0;
stage.Team2Score = 0;
stage.State = StageState.Standby;
stage.RoundState = RoundState.Prepare;
Packet pGameOver = new Packet(Operation.BattleRoundStateUpdate);
pGameOver.Write(stage.ID);
pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
pGameOver.Write((Int32)RoundState.Finish);
pGameOver.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
cli.Send(pGameOver);
pGameOver = new Packet(Operation.BattleRoundStateUpdate);
pGameOver.Write(stage.ID);
pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
pGameOver.Write((Int32)RoundState.Exit);
pGameOver.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
cli.Send(pGameOver);
pGameOver = new Packet(Operation.StageFinish);
pGameOver.Write(stage.ID);
foreach (Client cli in clis)
cli.Send(pGameOver);
foreach (Client cli in clis)
{
cli.InBattle = false;
cli.Alive = false;
cli.RequestedBattleInfo = false;
cli.RoundDeaths = 0;
cli.RoundKills = 0;
}
}
}
}
}
class TeamDeathMatchLogic : IBattleLogic
{
public void OnBattleInitialStart(Client client)
{
client.Stage.State = StageState.Standby;
client.Stage.RoundState = RoundState.Prepare;
client.Stage.Team1Score = 0;
client.Stage.Team2Score = 0;
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet2 = new Packet(Operation.StageLaunch);
packet2.Write(client.Stage.ID);
packet2.Write(client.Stage.MapName);
foreach (Client c in clients)
{
Helper.RegisterGenericBattleCallbacks(c);
c.KillCount = 0;
c.DeathCount = 0;
c.InBattle = true;
c.EnteredBattle = false;
c.RequestedBattleInfo = false;
c.Alive = false;
// c.Send(packet); /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
c.Send(packet2);
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Initial Start", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
public void OnBattleJoin(Client client)
{
client.InBattle = true;
client.Alive = false;
client.LateJoin = true;
// check state // maybe set a bool marking them as a newbie
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Late Join ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleLeave(Client client)
{
List<Client> clis = null;
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
pStageLeaveBattle.Write(client.SessionID);
pStageLeaveBattle.Write(client.Stage.ID);
foreach (Client cli in clis)
cli.Send(pStageLeaveBattle);
client.InBattle = false;
client.EnteredBattle = false;
client.RequestedBattleInfo = false;
client.Alive = false;
Helper.UnregisterAllBattleCallbacks(client);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Battle leaving..", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleKill(Client client, Client killer)
{
client.Alive = false;
List<Client> clis = null;
Packet packetdead = new Packet(Operation.GameDead);
packetdead.Write(killer.SessionID);
packetdead.Write((UInt32)0x0);
packetdead.Write(client.SessionID);
packetdead.Write((UInt32)0x0);
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
foreach (Client cli in clis)
cli.Send(packetdead);
client.DeathCount++;
client.RoundDeaths++;
if (killer.SessionID != client.SessionID)
{
killer.KillCount++;
killer.RoundKills++;
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone died ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
// check win state.
}
public void OnBattleSuicide(Client client)
{
}
public void OnBattleLoaded(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = new List<Client>(client.Stage.Clients);
client.Loaded = true;
Packet packet = new Packet(Operation.StageLoaded);
packet.Write(client.SessionID);
packet.Write((UInt32)0x64);
foreach (Client cli in clients)
cli.Send(packet);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone loaded ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleInfoRequest(Client client)
{
client.RequestedBattleInfo = true;
if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
{
// late join code??
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Info Requested ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleEnterRequest(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet = new Packet(Operation.StageEnterBattleResponse);
if (client.Stage.State == StageState.Standby)
packet.Write(Convert.ToByte(0));
else
packet.Write(Convert.ToByte(1));
packet.Write(166, 1);
/* possible loop entire client stage list in one packet */
Client c = client;
packet.Write(c.SessionID);
if (c.Bridge != null)
{
packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
packet.Write(c.Bridge.Port);
}
else
{
packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
packet.Write((int)0x00);
}
packet.Write(c.Character.Name, 32);
packet.Write(c.Character.ClanName, 16);
packet.Write((Int32)c.Character.ClanRank);
packet.Write(c.Character.ClanPoints);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(c.Character.Level));
packet.Write((byte)c.Character.Gender);
packet.Write((byte)c.Character.Hair);
packet.Write((byte)c.Character.Face);
packet.Write(c.Character.Experience);
packet.Write(c.Character.Bounty);
packet.Write(c.Character.Bonus);
packet.Write(c.Character.Prize);
packet.Write(c.Character.Health);
packet.Write(c.Character.Armor);
packet.Write(c.Character.MaxWeight);
packet.Write(c.Character.SafeFalls);
packet.Write(c.Character.FR);
packet.Write(c.Character.CR);
packet.Write(c.Character.ER);
packet.Write(c.Character.WR);
foreach (Int32 rentalid in c.Character.Equipment)
{
if (rentalid == 0) packet.Write((Int32)0);
else packet.Write(c.Character.Inventory[rentalid].ItemID);
}
packet.Write((Int32)c.Account.Access);
packet.Write(c.Character.ClanID);
packet.Write((byte)c.Team);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(0));
foreach (Client cli in clients)
cli.Send(packet);
client.EnteredBattle = true;
// Check round state
if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
{
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(2)); // hopefully this keeps them from spawning in
client.Send(packet);
}
client.LateJoin = false;
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Enter Battle ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
private void CheckBattleState(Client client)
{
List<Client> clients = null;
Stage stage = client.Stage;
lock (stage.Clients)
clients = stage.Clients.ToList().FindAll(c => c.InBattle);
if ((stage.RoundState == RoundState.Prepare || stage.RoundState == RoundState.Countdown) && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
{
List<Client> team1 = clients.FindAll(c => c.Team == Team.Team1);
if (team1.Count != clients.Count)
{
if (stage.RoundState == RoundState.Prepare)
stage.RoundState = RoundState.Countdown;
else
stage.RoundState = RoundState.Play;
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
if (stage.RoundState != RoundState.Play)
{
if (stage.State != StageState.Run)
stage.State = StageState.Run;
stage.RoundState = RoundState.Play;
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Checked prepare countdown ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
else
{
stage.RoundState = RoundState.Free;
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Going to free mode ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
else if (stage.RoundState == RoundState.Play) {
CheckWinCondition(client);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : After check win condition. ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
private void CheckWinCondition(Client client)
{
Stage stage = client.Stage;
List<Client> clis = null;
lock (stage.Clients)
clis = stage.Clients.ToList().FindAll(c => c.InBattle);
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
int winner = 0;
if (clis.FindAll(c => c.Team == Team.Team1).All(c => !c.Alive))
winner = 2;
else if (clis.FindAll(c => c.Team == Team.Team2).All(c => !c.Alive))
winner = 1;
if (winner == 0)
return;
// one team one.
stage.RoundState = RoundState.Finish;
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(winner));
foreach (Client cli in clis)
cli.Send(pRoundFinish);
stage.CurrentRound++;
List<Client> temp =null;
temp = clis.FindAll(c => c.Team == Team.Team1);
if (temp.Count == clis.Count)
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartIdleRound), stage);
}
else {
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartNextRound), stage);
}
}
private void StartNextRound(Object obj)
{
List<Client> clis = null;
Stage stage = (Stage)obj;
lock (stage.Clients) clis = stage.Clients.ToList();
stage.RoundState = RoundState.Prepare;
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = false;
cli.RequestedBattleInfo = false;
}
stage.RoundState = RoundState.Countdown;
pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0x0));
System.Threading.Thread.Sleep(500);
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
}
//if (clis.All(c => c.RequestedBattleInfo == true ))
//{
stage.RoundState = RoundState.Play;
pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0x0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = true;
}
//}
}
private void StartIdleRound(Object obj)
{
List<Client> clis = null;
Stage stage = (Stage)obj;
lock (stage.Clients) clis = stage.Clients;
stage.RoundState = RoundState.Free;
System.Threading.Thread.Sleep(500);
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = false;
cli.RequestedBattleInfo = false;
}
}
}
class TeamGladiatorLogic : IBattleLogic
{
public void OnBattleInitialStart(Client client)
{
client.Stage.State = StageState.Standby;
client.Stage.RoundState = RoundState.Prepare;
client.Stage.Team1Score = 0;
client.Stage.Team2Score = 0;
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet2 = new Packet(Operation.StageLaunch);
packet2.Write(client.Stage.ID);
packet2.Write(client.Stage.MapName);
foreach (Client c in clients)
{
Helper.RegisterGenericBattleCallbacks(c);
c.KillCount = 0;
c.DeathCount = 0;
c.InBattle = true;
c.EnteredBattle = false;
c.RequestedBattleInfo = false;
c.Alive = false;
// c.Send(packet); /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
c.Send(packet2);
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Initial Start", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
public void OnBattleJoin(Client client)
{
client.InBattle = true;
client.Alive = false;
client.LateJoin = true;
// check state // maybe set a bool marking them as a newbie
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Late Join ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleLeave(Client client)
{
List<Client> clis = null;
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
pStageLeaveBattle.Write(client.SessionID);
pStageLeaveBattle.Write(client.Stage.ID);
foreach (Client cli in clis)
cli.Send(pStageLeaveBattle);
client.InBattle = false;
client.EnteredBattle = false;
client.RequestedBattleInfo = false;
client.Alive = false;
Helper.UnregisterAllBattleCallbacks(client);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Battle leaving..", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleKill(Client client, Client killer)
{
client.Alive = false;
List<Client> clis = null;
Packet packetdead = new Packet(Operation.GameDead);
packetdead.Write(killer.SessionID);
packetdead.Write((UInt32)0x0);
packetdead.Write(client.SessionID);
packetdead.Write((UInt32)0x0);
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
foreach (Client cli in clis)
cli.Send(packetdead);
client.DeathCount++;
client.RoundDeaths++;
if (killer.SessionID != client.SessionID)
{
killer.KillCount++;
killer.RoundKills++;
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone died ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
// check win state.
}
public void OnBattleSuicide(Client client)
{
}
public void OnBattleLoaded(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = new List<Client>(client.Stage.Clients);
client.Loaded = true;
Packet packet = new Packet(Operation.StageLoaded);
packet.Write(client.SessionID);
packet.Write((UInt32)0x64);
foreach (Client cli in clients)
cli.Send(packet);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone loaded ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleInfoRequest(Client client)
{
client.RequestedBattleInfo = true;
if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
{
// late join code??
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Info Requested ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleEnterRequest(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet = new Packet(Operation.StageEnterBattleResponse);
if (client.Stage.State == StageState.Standby)
packet.Write(Convert.ToByte(0));
else
packet.Write(Convert.ToByte(1));
packet.Write(166, 1);
/* possible loop entire client stage list in one packet */
Client c = client;
packet.Write(c.SessionID);
if (c.Bridge != null)
{
packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
packet.Write(c.Bridge.Port);
}
else
{
packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
packet.Write((int)0x00);
}
packet.Write(c.Character.Name, 32);
packet.Write(c.Character.ClanName, 16);
packet.Write((Int32)c.Character.ClanRank);
packet.Write(c.Character.ClanPoints);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(c.Character.Level));
packet.Write((byte)c.Character.Gender);
packet.Write((byte)c.Character.Hair);
packet.Write((byte)c.Character.Face);
packet.Write(c.Character.Experience);
packet.Write(c.Character.Bounty);
packet.Write(c.Character.Bonus);
packet.Write(c.Character.Prize);
packet.Write(c.Character.Health);
packet.Write(c.Character.Armor);
packet.Write(c.Character.MaxWeight);
packet.Write(c.Character.SafeFalls);
packet.Write(c.Character.FR);
packet.Write(c.Character.CR);
packet.Write(c.Character.ER);
packet.Write(c.Character.WR);
foreach (Int32 rentalid in c.Character.Equipment)
{
if (rentalid == 0) packet.Write((Int32)0);
else if (rentalid == (Int32)RentalSlot.PrimaryWeapon - 1 || rentalid == (Int32)RentalSlot.SecondaryWeapon - 1 ||
rentalid == (Int32)RentalSlot.Custom1 - 1 || rentalid == (Int32)RentalSlot.Custom2 - 1) packet.Write((Int32)0);
else packet.Write(c.Character.Inventory[rentalid].ItemID);
}
packet.Write((Int32)c.Account.Access);
packet.Write(c.Character.ClanID);
packet.Write((byte)c.Team);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(0));
foreach (Client cli in clients)
cli.Send(packet);
client.EnteredBattle = true;
// Check round state
if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
{
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(2)); // hopefully this keeps them from spawning in
client.Send(packet);
}
client.LateJoin = false;
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Enter Battle ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
private void CheckBattleState(Client client)
{
List<Client> clients = null;
Stage stage = client.Stage;
lock (stage.Clients)
clients = stage.Clients.ToList().FindAll(c => c.InBattle);
if ((stage.RoundState == RoundState.Prepare || stage.RoundState == RoundState.Countdown) && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
{
List<Client> team1 = clients.FindAll(c => c.Team == Team.Team1);
if (team1.Count != clients.Count)
{
if (stage.RoundState == RoundState.Prepare)
stage.RoundState = RoundState.Countdown;
else
stage.RoundState = RoundState.Play;
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
if (stage.RoundState != RoundState.Play)
{
if (stage.State != StageState.Run)
stage.State = StageState.Run;
stage.RoundState = RoundState.Play;
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Checked prepare countdown ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
else
{
stage.RoundState = RoundState.Free;
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Going to free mode ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
else if (stage.RoundState == RoundState.Play)
{
CheckWinCondition(client);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : After check win condition. ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
private void CheckWinCondition(Client client)
{
Stage stage = client.Stage;
List<Client> clis = null;
lock (stage.Clients)
clis = stage.Clients.ToList().FindAll(c => c.InBattle);
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
int winner = 0;
if (clis.FindAll(c => c.Team == Team.Team1).All(c => !c.Alive))
winner = 2;
else if (clis.FindAll(c => c.Team == Team.Team2).All(c => !c.Alive))
winner = 1;
if (winner == 0)
return;
// one team one.
stage.RoundState = RoundState.Finish;
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(winner));
foreach (Client cli in clis)
cli.Send(pRoundFinish);
stage.CurrentRound++;
List<Client> temp = null;
temp = clis.FindAll(c => c.Team == Team.Team1);
if (temp.Count == clis.Count)
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartIdleRound), stage);
}
else
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartNextRound), stage);
}
}
private void StartNextRound(Object obj)
{
List<Client> clis = null;
Stage stage = (Stage)obj;
lock (stage.Clients) clis = stage.Clients.ToList();
stage.RoundState = RoundState.Prepare;
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = false;
cli.RequestedBattleInfo = false;
}
stage.RoundState = RoundState.Countdown;
pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0x0));
System.Threading.Thread.Sleep(500);
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
}
//if (clis.All(c => c.RequestedBattleInfo == true ))
//{
stage.RoundState = RoundState.Play;
pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0x0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = true;
}
//}
}
private void StartIdleRound(Object obj)
{
List<Client> clis = null;
Stage stage = (Stage)obj;
lock (stage.Clients) clis = stage.Clients;
stage.RoundState = RoundState.Free;
System.Threading.Thread.Sleep(500);
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = false;
cli.RequestedBattleInfo = false;
}
}
}
class AssassinMatchLogic : IBattleLogic
{
public void OnBattleInitialStart(Client client)
{
client.Stage.State = StageState.Standby;
client.Stage.RoundState = RoundState.Prepare;
client.Stage.Team1Score = 0;
client.Stage.Team2Score = 0;
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet2 = new Packet(Operation.StageLaunch);
packet2.Write(client.Stage.ID);
packet2.Write(client.Stage.MapName);
foreach (Client c in clients)
{
Helper.RegisterGenericBattleCallbacks(c);
c.KillCount = 0;
c.DeathCount = 0;
c.InBattle = true;
c.EnteredBattle = false;
c.RequestedBattleInfo = false;
c.Alive = false;
c.Commander = false;
// c.Send(packet); /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
c.Send(packet2);
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Initial Start", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
public void OnBattleJoin(Client client)
{
client.InBattle = true;
client.Alive = false;
client.LateJoin = true;
// check state // maybe set a bool marking them as a newbie
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Late Join ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleLeave(Client client)
{
List<Client> clis = null;
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
pStageLeaveBattle.Write(client.SessionID);
pStageLeaveBattle.Write(client.Stage.ID);
foreach (Client cli in clis)
cli.Send(pStageLeaveBattle);
client.InBattle = false;
client.EnteredBattle = false;
client.RequestedBattleInfo = false;
client.Alive = false;
Helper.UnregisterAllBattleCallbacks(client);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Battle leaving..", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleKill(Client client, Client killer)
{
client.Alive = false;
List<Client> clis = null;
Packet packetdead = new Packet(Operation.GameDead);
packetdead.Write(killer.SessionID);
packetdead.Write((UInt32)0x0);
packetdead.Write(client.SessionID);
packetdead.Write((UInt32)0x0);
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
foreach (Client cli in clis)
cli.Send(packetdead);
client.DeathCount++;
client.RoundDeaths++;
if (killer.SessionID != client.SessionID)
{
killer.KillCount++;
killer.RoundKills++;
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone died ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
// check win state.
}
public void OnBattleSuicide(Client client)
{
}
public void OnBattleLoaded(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = new List<Client>(client.Stage.Clients);
client.Loaded = true;
Packet packet = new Packet(Operation.StageLoaded);
packet.Write(client.SessionID);
packet.Write((UInt32)0x64);
foreach (Client cli in clients)
cli.Send(packet);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Someone loaded ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleInfoRequest(Client client)
{
client.RequestedBattleInfo = true;
if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
{
// late join code??
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Info Requested ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
public void OnBattleEnterRequest(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet = new Packet(Operation.StageEnterBattleResponse);
if (client.Stage.State == StageState.Standby)
packet.Write(Convert.ToByte(0));
else
packet.Write(Convert.ToByte(1));
packet.Write(166, 1);
/* possible loop entire client stage list in one packet */
Client c = client;
packet.Write(c.SessionID);
if (c.Bridge != null)
{
packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
packet.Write(c.Bridge.Port);
}
else
{
packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
packet.Write((int)0x00);
}
packet.Write(c.Character.Name, 32);
packet.Write(c.Character.ClanName, 16);
packet.Write((Int32)c.Character.ClanRank);
packet.Write(c.Character.ClanPoints);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(c.Character.Level));
packet.Write((byte)c.Character.Gender);
packet.Write((byte)c.Character.Hair);
packet.Write((byte)c.Character.Face);
packet.Write(c.Character.Experience);
packet.Write(c.Character.Bounty);
packet.Write(c.Character.Bonus);
packet.Write(c.Character.Prize);
packet.Write(c.Character.Health);
packet.Write(c.Character.Armor);
packet.Write(c.Character.MaxWeight);
packet.Write(c.Character.SafeFalls);
packet.Write(c.Character.FR);
packet.Write(c.Character.CR);
packet.Write(c.Character.ER);
packet.Write(c.Character.WR);
foreach (Int32 rentalid in c.Character.Equipment)
{
if (rentalid == 0) packet.Write((Int32)0);
else packet.Write(c.Character.Inventory[rentalid].ItemID);
}
packet.Write((Int32)c.Account.Access);
packet.Write(c.Character.ClanID);
packet.Write((byte)c.Team);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(0));
foreach (Client cli in clients)
cli.Send(packet);
client.EnteredBattle = true;
// Check round state
if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
{
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(2)); // hopefully this keeps them from spawning in
client.Send(packet);
}
client.LateJoin = false;
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Enter Battle ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
CheckBattleState(client);
}
private void CheckBattleState(Client client)
{
List<Client> clients = null;
Stage stage = client.Stage;
lock (stage.Clients)
clients = stage.Clients.ToList().FindAll(c => c.InBattle);
if ((stage.RoundState == RoundState.Prepare || stage.RoundState == RoundState.Countdown) && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
{
List<Client> team1 = clients.FindAll(c => c.Team == Team.Team1);
if (team1.Count != clients.Count)
{
if (stage.RoundState == RoundState.Prepare)
stage.RoundState = RoundState.Countdown;
else
stage.RoundState = RoundState.Play;
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
if (stage.RoundState != RoundState.Play)
{
if (stage.State != StageState.Run)
stage.State = StageState.Run;
stage.RoundState = RoundState.Play;
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
}
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Checked prepare countdown ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
else
{
stage.RoundState = RoundState.Free;
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(stage.ID);
packet.Write(Convert.ToInt32(stage.CurrentRound));
packet.Write((Int32)stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients) { c.RequestedBattleInfo = false; c.Send(packet); }
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : Going to free mode ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
else if (stage.RoundState == RoundState.Play)
{
CheckWinCondition(client);
Server.Log(LogLevel.Debug, "Battle Logic", "Stage {0} : {1} : {2} : After check win condition. ", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
private void CheckWinCondition(Client client)
{
Stage stage = client.Stage;
List<Client> clis = null;
lock (stage.Clients)
clis = stage.Clients.ToList().FindAll(c => c.InBattle);
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
int winner = 0;
if (clis.FindAll(c => c.Team == Team.Team1).Any(c => !c.Alive) && clis.FindAll(c => c.Team == Team.Team1).Any(c => c.Commander))
{
winner = 2;
client.Log(LogLevel.Debug, "Winner: {0}", winner);
}
if (clis.FindAll(c => c.Team == Team.Team2).Any(c => !c.Alive) && clis.FindAll(c => c.Team == Team.Team2).Any(c => c.Commander))
{
winner = 1;
client.Log(LogLevel.Debug, "Winner2: {0}", winner);
}
if (winner == (int)Team.Solo)
return;
// one team one.
stage.RoundState = RoundState.Finish;
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(winner));
foreach (Client cli in clis)
cli.Send(pRoundFinish);
stage.CurrentRound++;
List<Client> temp = null;
temp = clis.FindAll(c => c.Team == Team.Team1);
if (temp.Count == clis.Count)
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartIdleRound), stage);
}
else
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(StartNextRound), stage);
}
}
private void StartNextRound(Object obj)
{
List<Client> clis = null;
Stage stage = (Stage)obj;
lock (stage.Clients) clis = stage.Clients.ToList();
stage.RoundState = RoundState.Prepare;
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = false;
cli.RequestedBattleInfo = false;
}
stage.RoundState = RoundState.Countdown;
pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0x0));
System.Threading.Thread.Sleep(500);
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
}
//if (clis.All(c => c.RequestedBattleInfo == true ))
//{
stage.RoundState = RoundState.Play;
pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0x0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = true;
}
List<Client>Clist = clis.FindAll(c => c.Team == Team.Team1);
List<Client> Clist2 = clis.FindAll(c => c.Team == Team.Team2);
Random r = new Random();
int rCommanderIndex = r.Next(Clist.Count());
int bCommanderIndex = r.Next(Clist2.Count());
Clist[rCommanderIndex].Commander = true;
Clist2[bCommanderIndex].Commander = true;
Packet cPacket = new Packet(Operation.AssignCommander);
cPacket.Write(Clist[rCommanderIndex].SessionID);
cPacket.Write(Clist2[bCommanderIndex].SessionID);
foreach (Client cli in clis) cli.Send(cPacket);
//}
}
private void StartIdleRound(Object obj)
{
List<Client> clis = null;
Stage stage = (Stage)obj;
lock (stage.Clients) clis = stage.Clients;
stage.RoundState = RoundState.Free;
System.Threading.Thread.Sleep(500);
Packet pRoundFinish = new Packet(Operation.BattleRoundStateUpdate);
pRoundFinish.Write(stage.ID);
pRoundFinish.Write(Convert.ToInt32(stage.CurrentRound));
pRoundFinish.Write((Int32)stage.RoundState);
pRoundFinish.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
{
cli.Send(pRoundFinish);
cli.Alive = false;
cli.RequestedBattleInfo = false;
}
}
}
class BerserkerMatchLogic : IBattleLogic
{
public void OnBattleInitialStart(Client client)
{
client.Stage.State = StageState.Standby;
client.Stage.RoundState = RoundState.Prepare;
client.Stage.Team1Score = 0;
client.Stage.Team2Score = 0;
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet2 = new Packet(Operation.StageLaunch);
packet2.Write(client.Stage.ID);
packet2.Write(client.Stage.MapName);
foreach (Client c in clients)
{
Helper.RegisterGenericBattleCallbacks(c);
c.KillCount = 0;
c.DeathCount = 0;
c.InBattle = true;
c.EnteredBattle = false;
c.RequestedBattleInfo = false;
c.Berserker = false;
c.Alive = false;
// c.Send(packet); /* Do we need this? */ // Moved to Battle logic, originally was the battle start packet the master, and not battle launch
c.Send(packet2);
}
}
public void OnBattleJoin(Client client)
{
client.InBattle = true;
client.Alive = false;
client.LateJoin = true;
// check state // maybe set a bool marking them as a newbie
CheckBattleState(client);
}
public void OnBattleLeave(Client client)
{
List<Client> clis = null;
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
Packet pStageLeaveBattle = new Packet(Operation.StageLeaveBattle);
pStageLeaveBattle.Write(client.SessionID);
pStageLeaveBattle.Write(client.Stage.ID);
foreach (Client cli in clis)
cli.Send(pStageLeaveBattle);
client.InBattle = false;
client.EnteredBattle = false;
client.RequestedBattleInfo = false;
client.Alive = false;
Helper.UnregisterAllBattleCallbacks(client);
CheckBattleState(client);
}
public void OnBattleKill(Client client, Client killer)
{
client.Alive = false;
List<Client> clis = null;
Packet packetdead = new Packet(Operation.GameDead);
packetdead.Write(killer.SessionID);
packetdead.Write((UInt32)0x0);
packetdead.Write(client.SessionID);
packetdead.Write((UInt32)0x0);
lock (client.Stage.Clients)
clis = client.Stage.Clients.ToList();
foreach (Client cli in clis)
cli.Send(packetdead);
client.DeathCount++;
client.RoundDeaths++;
if (killer.SessionID != client.SessionID)
{
killer.KillCount++;
killer.RoundKills++;
}
bool bFound = false;
foreach (Client cli in clis)
if (cli.Berserker == true)
bFound = true;
if (client.Berserker == true || bFound == false)
{
Packet packetserk = new Packet(Operation.AssignBerserker);
packetserk.Write(killer.SessionID);
foreach (Client cl in clis) cl.Send(packetserk);
client.Berserker = false;
killer.Berserker = true;
}
CheckBattleState(client);
// check win state.
}
public void OnBattleSuicide(Client client)
{
}
public void OnBattleLoaded(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = new List<Client>(client.Stage.Clients);
client.Loaded = true;
Packet packet = new Packet(Operation.StageLoaded);
packet.Write(client.SessionID);
packet.Write((UInt32)0x64);
foreach (Client cli in clients)
cli.Send(packet);
CheckBattleState(client);
}
public void OnBattleInfoRequest(Client client)
{
client.RequestedBattleInfo = true;
if (client.Stage.State == StageState.Run && client.Stage.RoundState == RoundState.Play)
{
}
CheckBattleState(client);
}
public void OnBattleEnterRequest(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients) clients = new List<Client>(client.Stage.Clients);
Packet packet = new Packet(Operation.StageEnterBattleResponse);
if (client.Stage.State == StageState.Standby)
packet.Write(Convert.ToByte(0));
else
packet.Write(Convert.ToByte(1));
packet.Write(166, 1);
/* possible loop entire client stage list in one packet */
Client c = client;
packet.Write(c.SessionID);
if (c.Bridge != null)
{
packet.Write(c.Bridge.Address.GetAddressBytes(), 0, 4);
packet.Write(c.Bridge.Port);
}
else
{
packet.Write(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0, 4);
packet.Write((int)0x00);
}
packet.Write(c.Character.Name, 32);
packet.Write(c.Character.ClanName, 16);
packet.Write((Int32)c.Character.ClanRank);
packet.Write(c.Character.ClanPoints);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(c.Character.Level));
packet.Write((byte)c.Character.Gender);
packet.Write((byte)c.Character.Hair);
packet.Write((byte)c.Character.Face);
packet.Write(c.Character.Experience);
packet.Write(c.Character.Bounty);
packet.Write(c.Character.Bonus);
packet.Write(c.Character.Prize);
packet.Write(c.Character.Health);
packet.Write(c.Character.Armor);
packet.Write(c.Character.MaxWeight);
packet.Write(c.Character.SafeFalls);
packet.Write(c.Character.FR);
packet.Write(c.Character.CR);
packet.Write(c.Character.ER);
packet.Write(c.Character.WR);
foreach (Int32 rentalid in c.Character.Equipment)
{
if (rentalid == 0) packet.Write((Int32)0);
else packet.Write(c.Character.Inventory[rentalid].ItemID);
}
packet.Write((Int32)c.Account.Access);
packet.Write(c.Character.ClanID);
packet.Write((byte)c.Team);
packet.Write(Convert.ToByte(0));
packet.Write(Convert.ToInt16(0));
foreach (Client cli in clients)
cli.Send(packet);
client.EnteredBattle = true;
// Check round state
if (client.LateJoin && client.Stage.RoundState == RoundState.Play)
{
// taking this out leaves them zoomed around the map.
packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(0));
client.Send(packet);
}
client.LateJoin = false;
CheckBattleState(client);
}
private void CheckBattleState(Client client)
{
List<Client> clients = null;
lock (client.Stage.Clients)
clients = client.Stage.Clients.ToList();
if (client.Stage.State == StageState.Standby)
{ // Initial round not yet loaded
if (client.Stage.RoundState == RoundState.Prepare && clients.FindAll(c => c.InBattle).TrueForAll(c => (c.EnteredBattle == true && c.RequestedBattleInfo)))
{
client.Stage.State = StageState.Run;
client.Stage.RoundState = RoundState.Play;
foreach (Client cli in clients)
{
cli.RequestedBattleInfo = false;
cli.Alive = true;
}
Helper.UpdateChannelStages(client.Channel, null);
Packet packet = new Packet(Operation.BattleRoundStateUpdate);
packet.Write(client.Stage.ID);
packet.Write(Convert.ToInt32(client.Stage.CurrentRound));
packet.Write((Int32)client.Stage.RoundState);
packet.Write(Convert.ToInt32(0));
foreach (Client c in clients)
c.Send(packet);
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
}
}
else if (client.Stage.State == StageState.Run)
{ // Game Running
if (client.Stage.RoundState == RoundState.Prepare)
{
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Prepare", client.Stage.ID);
return;
}
else if (client.Stage.RoundState == RoundState.Countdown)
{
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in Run|Countdown", client.Stage.ID);
return;
}
else if (client.Stage.RoundState == RoundState.Play)
{
CheckWinCondition(client);
return;
}
}
}
private void CheckWinCondition(Client client)
{
Stage stage = client.Stage;
Server.Log(LogLevel.Debug, "BattleLogic", "DM Stage {0} in {1}, {2}", client.Stage.ID, client.Stage.State, client.Stage.RoundState);
if (stage.RoundState == RoundState.Play)
{
List<Client> clis = null;
lock (stage.Clients)
clis = stage.Clients.FindAll(c => c.InBattle == true);
bool GameOver = false;
foreach (Client cli in clis)
{
if (cli.RoundKills >= stage.Rounds)
{
GameOver = true;
break;
}
}
if (GameOver == true)
{
stage.CurrentRound = 0;
stage.Team1Score = 0;
stage.Team2Score = 0;
stage.State = StageState.Standby;
stage.RoundState = RoundState.Prepare;
Packet pGameOver = new Packet(Operation.BattleRoundStateUpdate);
pGameOver.Write(stage.ID);
pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
pGameOver.Write((Int32)RoundState.Finish);
pGameOver.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
cli.Send(pGameOver);
pGameOver = new Packet(Operation.BattleRoundStateUpdate);
pGameOver.Write(stage.ID);
pGameOver.Write(Convert.ToInt32(stage.CurrentRound));
pGameOver.Write((Int32)RoundState.Exit);
pGameOver.Write(Convert.ToInt32(0));
foreach (Client cli in clis)
cli.Send(pGameOver);
pGameOver = new Packet(Operation.StageFinish);
pGameOver.Write(stage.ID);
foreach (Client cli in clis)
cli.Send(pGameOver);
foreach (Client cli in clis)
{
cli.InBattle = false;
cli.Alive = false;
cli.RequestedBattleInfo = false;
cli.RoundDeaths = 0;
cli.RoundKills = 0;
}
}
}
}
}
}