public static void Load(Client pClient, Packet pPacket) { int accountIdentifier; int playerIdentifier; if (!pPacket.ReadInt(out playerIdentifier) || (accountIdentifier = Server.ValidatePlayerLogin(playerIdentifier, pClient.Host)) == 0) { pClient.Disconnect(); return; } using (DatabaseQuery query = Database.Query("SELECT * FROM account WHERE identifier=@identifier", new MySqlParameter("@identifier", accountIdentifier))) { query.NextRow(); pClient.Account = new Account(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player WHERE identifier=@identifier", new MySqlParameter("@identifier", playerIdentifier))) { query.NextRow(); pClient.Player = new Player(pClient, query); } pClient.Player.Map.AddPlayer(pClient.Player); Server.UnregisterPlayerLogin(playerIdentifier); Log.WriteLine(ELogLevel.Info, "[{0}] Loaded {1}", pClient.Host, pClient.Player.Name); pClient.Player.SendInitialMapChange(); pClient.Player.SendKeymap(); pClient.Player.SendBuddyUpdate(EBuddyUpdateType.Add); pClient.Player.SendMacroList(); pClient.Player.SendMessage(EMessageType.ErrorText, "Welcome to Chronicle {0}", Server.Version); pClient.Player.EnterMap(); }
public static void Action(Client pClient, Packet pPacket) { int uniqueIdentifier; short moveIdentifier; bool isUsingAbility; byte usingAbility; Coordinates projectileTarget; if (!pPacket.ReadInt(out uniqueIdentifier) || !pPacket.ReadShort(out moveIdentifier) || !pPacket.ReadBool(out isUsingAbility) || !pPacket.ReadByte(out usingAbility) || !pPacket.ReadCoordinates(out projectileTarget) || !pPacket.ReadSkip(5)) { pClient.Disconnect(); return; } Mob mob = pClient.Player.Map.GetMob(uniqueIdentifier); if (mob == null || mob.Controller != pClient.Player) return; int rewindOffset = pPacket.Cursor; Coordinates unknownPosition; if (!pPacket.ReadCoordinates(out unknownPosition) || !pClient.Player.Map.ReadMovement(mob, pPacket)) { pClient.Disconnect(); return; } Packet packet = new Packet(EOpcode.SMSG_MOB_ACTION_CONFIRM); packet.WriteInt(uniqueIdentifier); packet.WriteShort(moveIdentifier); packet.WriteBool(isUsingAbility); packet.WriteUShort((ushort)mob.Mana); packet.WriteByte(0x00); // Ability Identifier packet.WriteByte(0x00); // Ability Level pClient.SendPacket(packet); pPacket.Rewind(rewindOffset); packet = new Packet(EOpcode.SMSG_MOB_ACTION); packet.WriteInt(uniqueIdentifier); packet.WriteBool(isUsingAbility); packet.WriteByte(usingAbility); packet.WriteCoordinates(projectileTarget); packet.WriteBytes(pPacket.InnerBuffer, pPacket.Cursor, pPacket.Remaining); pClient.Player.Map.SendPacketToAllExcept(packet, pClient.Player); pClient.Player.Map.UpdateMobControllers(true); }
public static void AllPlayerConnect(Client pClient, Packet pPacket) { int identifier; if (!pPacket.ReadInt(out identifier) || (long)Database.Scalar("SELECT COUNT(*) FROM player WHERE identifier=@identifier AND account_identifier=@account_identifier", new MySqlParameter("@identifier", identifier), new MySqlParameter("@account_identifier", pClient.Account.Identifier)) == 0) { pClient.Disconnect(); return; } Server.RegisterPlayerLogin(pClient.Account.Identifier, identifier, pClient.Host); SendChannelConnect(pClient, identifier); }
public static void Emote(Client pClient, Packet pPacket) { int emote; if (!pPacket.ReadInt(out emote)) { pClient.Disconnect(); return; } Packet packet = new Packet(EOpcode.SMSG_PLAYER_EMOTE); packet.WriteInt(pClient.Player.Identifier); packet.WriteInt(emote); pClient.Player.Map.SendPacketToAllExcept(packet, pClient.Player); }
public static void Chat(Client pClient, Packet pPacket) { string message; bool bubble; if (!pPacket.ReadString(out message) || !pPacket.ReadBool(out bubble)) { pClient.Disconnect(); return; } Packet packet = new Packet(EOpcode.SMSG_PLAYER_CHAT); packet.WriteInt(pClient.Player.Identifier); packet.WriteBool(pClient.Account.Level > 0); packet.WriteString(message); packet.WriteBool(bubble); pClient.Player.Map.SendPacketToAll(packet); }
public static void Action(Client pClient, Packet pPacket) { int firstUnknown; short secondUnknown; if (!pPacket.ReadInt(out firstUnknown) || !pPacket.ReadShort(out secondUnknown)) { pClient.Disconnect(); return; } Packet packet = new Packet(EOpcode.SMSG_NPC_ACTION); byte thirdUnknown; if (!pPacket.ReadByte(out thirdUnknown)) { packet.WriteInt(firstUnknown); packet.WriteShort(secondUnknown); } else packet.WriteBytes(pPacket.InnerBuffer, pPacket.Cursor, pPacket.Remaining); pClient.SendPacket(packet); }
public static void ScriptTrigger(Client pClient, Packet pPacket) { string name; if (!pPacket.ReadSkip(1) || !pPacket.ReadString(out name)) { pClient.Disconnect(); return; } Portal portal = pClient.Player.Map.GetPortal(name); if (portal == null || portal.Script == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Script Blocked {1}", pClient.Host, name); pClient.Player.SendPortalBlocked(); return; } Log.WriteLine(ELogLevel.Info, "[{0}] Portal Script Triggered {1}", pClient.Host, portal.Script.GetType().FullName); portal.Script.Execute(pClient.Player, portal); }
public static void Authentication(Client pClient, Packet pPacket) { string username; string password; byte[] macBytes = new byte[6]; if (!pPacket.ReadString(out username) || !pPacket.ReadString(out password) || !pPacket.ReadBytes(macBytes)) { pClient.Disconnect(); return; } Account account = null; using (DatabaseQuery query = Database.Query("SELECT * FROM account WHERE username=@username", new MySqlParameter("@username", username))) { if (!query.NextRow()) { SendAuthentication(pClient, EAuthenticationResult.Invalid); return; } account = new Account(query); } if (password != account.Password) { SendAuthentication(pClient, EAuthenticationResult.Incorrect); return; } if (Server.IsAccountOnline(account.Identifier) || Server.IsPendingPlayerLogin(account.Identifier)) { SendAuthentication(pClient, EAuthenticationResult.Online); return; } pClient.Account = account; Log.WriteLine(ELogLevel.Info, "[{0}] Authenticated {1}", pClient.Host, pClient.Account.Username); SendAuthentication(pClient, EAuthenticationResult.Ok); }
public static void Pin(Client pClient, Packet pPacket) { SendPin(pClient); }
public static void Disconnect(Client pClient, Packet pPacket) { if (pClient.Account == null) pClient.Disconnect(); }
public static void AllPlayerList(Client pClient, Packet pPacket) { SendAllPlayerList(pClient); }
public static void Teleport(Client pClient, Packet pPacket) { int mapIdentifier; if (!pPacket.ReadSkip(1) || !pPacket.ReadInt(out mapIdentifier)) { pClient.Disconnect(); return; } if (mapIdentifier == -1) { string portalName; if (!pPacket.ReadString(out portalName)) { pClient.Disconnect(); return; } Portal portal = pClient.Player.Map.GetPortal(portalName); if (portal == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Blocked {1}", pClient.Host, portalName); pClient.Player.SendPortalBlocked(); return; } Map mapDestination = Server.GetActiveMap(portal.Data.ToMapIdentifier); if (mapDestination == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Blocked {1}", pClient.Host, portalName); pClient.Player.SendPortalBlocked(); return; } Portal portalDestination = mapDestination.GetPortal(portal.Data.ToName); if (portalDestination == null) { Log.WriteLine(ELogLevel.Debug, "[{0}] Portal Blocked {1}", pClient.Host, portalName); pClient.Player.SendPortalBlocked(); return; } Log.WriteLine(ELogLevel.Info, "[{0}] Portal Triggered {1}", pClient.Host, portal.Data.Name); pClient.Player.Map.RemovePlayer(pClient.Player); pClient.Player.Map = mapDestination; pClient.Player.Map.AddPlayer(pClient.Player); pClient.Player.Spawn = portalDestination.Index; pClient.Player.Position.X = portalDestination.Data.X; pClient.Player.Position.Y = portalDestination.Data.Y; pClient.Player.Stance = 0; pClient.Player.Foothold = 0; pClient.Player.FallCount = 0; pClient.Player.SendMapChange(); pClient.Player.EnterMap(); } }
private static void SendAuthentication(Client pClient, EAuthenticationResult pResult) { Packet packet = new Packet(EOpcode.SMSG_AUTHENTICATION); packet.WriteUInt((uint)pResult); packet.WriteSkip(2); if (pClient.Account != null) { packet.WriteInt(pClient.Account.Identifier); packet.WriteSkip(4); packet.WriteString(pClient.Account.Username); packet.WriteSkip(22); } pClient.SendPacket(packet); }
private static void SendPlayerList(Client pClient) { Packet packet = new Packet(EOpcode.SMSG_PLAYER_LIST); packet.WriteByte(0x00); byte playerCount = (byte)(long)Database.Scalar("SELECT COUNT(*) FROM player WHERE account_identifier=@account_identifier", new MySqlParameter("@account_identifier", pClient.Account.Identifier)); packet.WriteByte(playerCount); if (playerCount > 0) { using (DatabaseQuery query = Database.Query("SELECT * FROM player WHERE account_identifier=@account_identifier", new MySqlParameter("@account_identifier", pClient.Account.Identifier))) { while (query.NextRow()) WritePlayer(packet, query); } } packet.WriteInt(Config.Instance.Login.MaxPlayersPerAccount); pClient.SendPacket(packet); }
public static void PlayerNameCheck(Client pClient, Packet pPacket) { string name; if (!pPacket.ReadString(out name)) { pClient.Disconnect(); return; } bool unusable = name.Length < 4 || name.Length > 16 || (long)Database.Scalar("SELECT COUNT(*) FROM player WHERE name=@name", new MySqlParameter("@name", name)) != 0; SendPlayerNameCheck(pClient, name, unusable); }
public static void WorldListRefresh(Client pClient, Packet pPacket) { SendWorldList(pClient); }
private static void SendPlayerDelete(Client pClient, int pPlayerIdentifier) { Packet packet = new Packet(EOpcode.SMSG_PLAYER_DELETE); packet.WriteInt(pPlayerIdentifier); packet.WriteByte(0x00); pClient.SendPacket(packet); }
private static void SendPlayerCreate(Client pClient, DatabaseQuery pQuery) { Packet packet = new Packet(EOpcode.SMSG_PLAYER_CREATE); packet.WriteByte(0x00); WritePlayer(packet, pQuery); pClient.SendPacket(packet); }
private static void SendPin(Client pClient) { Packet packet = new Packet(EOpcode.SMSG_PIN); packet.WriteByte(0x00); pClient.SendPacket(packet); }
private static void SendChannelConnect(Client pClient, int pPlayerIdentifier) { Packet packet = new Packet(EOpcode.SMSG_CHANNEL_CONNECT); packet.WriteByte(0x00); packet.WriteByte(0x00); packet.WriteBytes(IPAddress.Parse(Config.Instance.Channel.ExternalAddress).GetAddressBytes()); packet.WriteUShort(Config.Instance.Channel.Listener.Port); packet.WriteInt(pPlayerIdentifier); packet.WriteSkip(5); pClient.SendPacket(packet); }
internal static void ClientDisconnected(Client pClient) { lock (sClients) sClients.Remove(pClient); }
public static void PlayerDelete(Client pClient, Packet pPacket) { int identifier; if (!pPacket.ReadSkip(4) || !pPacket.ReadInt(out identifier) || (long)Database.Scalar("SELECT COUNT(*) FROM player WHERE identifier=@identifier AND account_identifier=@account_identifier", new MySqlParameter("@identifier", identifier), new MySqlParameter("@account_identifier", pClient.Account.Identifier)) == 0) { pClient.Disconnect(); return; } Database.Execute("DELETE FROM player WHERE identifier=@identifier", new MySqlParameter("@identifier", identifier)); SendPlayerDelete(pClient, identifier); }
private static void EndLoginListenerAccept(SocketAsyncEventArgs pArguments) { try { if (pArguments.SocketError == SocketError.Success) { Client client = new Client(pArguments.AcceptSocket); byte[] receiveIV = new byte[] { 0x46, 0x72, 0x7A, 0x52 }; // TODO: Randomize byte[] sendIV = new byte[] { 0x52, 0x30, 0x78, 0x73 }; // TODO: Randomize lock (sClients) sClients.Add(client); client.SendHandshake(Config.Instance.Build, receiveIV, sendIV); BeginLoginListenerAccept(pArguments); } else if (pArguments.SocketError != SocketError.OperationAborted) Log.WriteLine(ELogLevel.Error, "[Server] LoginListener Error: {0}", pArguments.SocketError); } catch (ObjectDisposedException) { } catch (Exception exc) { Log.WriteLine(ELogLevel.Exception, "[Server] LoginListener Exception: {0}", exc.Message); } }
private static void SendWorldStatus(Client pClient) { int population = Server.Population; Packet packet = new Packet(EOpcode.SMSG_WORLD_STATUS); if (population >= Config.Instance.Channel.MaxPopulation) packet.WriteByte(0x02); else if (population >= (Config.Instance.Channel.MaxPopulation * 0.9)) packet.WriteByte(0x01); else packet.WriteByte(0x00); packet.WriteByte(0); pClient.SendPacket(packet); }
public static void Move(Client pClient, Packet pPacket) { if (!pPacket.ReadSkip(9)) { pClient.Disconnect(); return; } int rewindOffset = pPacket.Cursor; pClient.Player.Map.ReadMovement(pClient.Player, pPacket); pPacket.Rewind(rewindOffset); Packet packet = new Packet(EOpcode.SMSG_PLAYER_MOVE); packet.WriteInt(pClient.Player.Identifier); packet.WriteInt(0); packet.WriteBytes(pPacket.InnerBuffer, pPacket.Cursor, pPacket.Remaining); pClient.Player.Map.SendPacketToAllExcept(packet, pClient.Player); if (pClient.Player.Foothold == 0) { } else pClient.Player.FallCount = 0; pClient.Player.Map.UpdateMobControllers(true); }
public static void WorldStatus(Client pClient, Packet pPacket) { SendWorldStatus(pClient); }
private static void SendPlayerNameCheck(Client pClient, string pName, bool pUnusable) { Packet packet = new Packet(EOpcode.SMSG_PLAYER_NAME_CHECK); packet.WriteString(pName); packet.WriteBool(pUnusable); pClient.SendPacket(packet); }
public static void PlayerCreate(Client pClient, Packet pPacket) { string name; int eyesIdentifier; int hairIdentifier; int hairColor; int skin; int shirtIdentifier; int pantsIdentifier; int shoesIdentifier; int weaponIdentifier; byte gender; if (!pPacket.ReadString(out name) || !pPacket.ReadInt(out eyesIdentifier) || !pPacket.ReadInt(out hairIdentifier) || !pPacket.ReadInt(out hairColor) || !pPacket.ReadInt(out skin) || !pPacket.ReadInt(out shirtIdentifier) || !pPacket.ReadInt(out pantsIdentifier) || !pPacket.ReadInt(out shoesIdentifier) || !pPacket.ReadInt(out weaponIdentifier) || !pPacket.ReadByte(out gender)) { pClient.Disconnect(); return; } bool unusable = name.Length < 4 || name.Length > 16 || (long)Database.Scalar("SELECT COUNT(*) FROM player WHERE name=@name", new MySqlParameter("@name", name)) != 0; if (unusable) { SendPlayerNameCheck(pClient, name, true); return; } hairIdentifier += hairColor; int identifier = Database.InsertAndReturnIdentifier("INSERT INTO player(account_identifier,name,gender,skin,eyes_identifier,hair_identifier) " + "VALUES(@account_identifier,@name,@gender,@skin,@eyes_identifier,@hair_identifier)", new MySqlParameter("@account_identifier", pClient.Account.Identifier), new MySqlParameter("@name", name), new MySqlParameter("@gender", gender), new MySqlParameter("@skin", skin), new MySqlParameter("@eyes_identifier", eyesIdentifier), new MySqlParameter("@hair_identifier", hairIdentifier)); Database.Execute("INSERT INTO player_keymap(player_identifier) VALUES(@player_identifier)", new MySqlParameter("@player_identifier", identifier)); Database.Execute("INSERT INTO player_item(player_identifier,inventory_type,inventory_slot,item_identifier,weapon_defense) " + "VALUES(@player_identifier,@inventory_type,-5,@item_identifier,3)", new MySqlParameter("@player_identifier", identifier), new MySqlParameter("@inventory_type", EInventoryType.Equipment), new MySqlParameter("@item_identifier", shirtIdentifier)); Database.Execute("INSERT INTO player_item(player_identifier,inventory_type,inventory_slot,item_identifier,weapon_defense) " + "VALUES(@player_identifier,@inventory_type,-6,@item_identifier,2)", new MySqlParameter("@player_identifier", identifier), new MySqlParameter("@inventory_type", EInventoryType.Equipment), new MySqlParameter("@item_identifier", pantsIdentifier)); Database.Execute("INSERT INTO player_item(player_identifier,inventory_type,inventory_slot,item_identifier,unused_scroll_slots,weapon_defense) " + "VALUES(@player_identifier,@inventory_type,-7,@item_identifier,5,3)", new MySqlParameter("@player_identifier", identifier), new MySqlParameter("@inventory_type", EInventoryType.Equipment), new MySqlParameter("@item_identifier", shoesIdentifier)); Database.Execute("INSERT INTO player_item(player_identifier,inventory_type,inventory_slot,item_identifier,weapon_attack) " + "VALUES(@player_identifier,@inventory_type,-11,@item_identifier,17)", new MySqlParameter("@player_identifier", identifier), new MySqlParameter("@inventory_type", EInventoryType.Equipment), new MySqlParameter("@item_identifier", weaponIdentifier)); Database.Execute("INSERT INTO player_item(player_identifier,inventory_type,inventory_slot,item_identifier) VALUES(@player_identifier,@inventory_type,1,4161001)", new MySqlParameter("@player_identifier", identifier), new MySqlParameter("@inventory_type", EInventoryType.Etc)); using (DatabaseQuery query = Database.Query("SELECT * FROM player WHERE identifier=@identifier", new MySqlParameter("@identifier", identifier))) { query.NextRow(); SendPlayerCreate(pClient, query); } }
private static void SendWorldList(Client pClient) { Packet packet = new Packet(EOpcode.SMSG_WORLD_LIST); packet.WriteByte(0); packet.WriteString("Scania"); packet.WriteByte(Config.Instance.World.Ribbon); packet.WriteString(Config.Instance.World.EventMessage); packet.WriteByte(Config.Instance.World.ExperienceModifier); packet.WriteByte(0); packet.WriteByte(Config.Instance.World.DropModifier); packet.WriteByte(0); packet.WriteByte(0); packet.WriteByte(1); packet.WriteString("Scania-1"); packet.WriteInt(Server.Population); packet.WriteByte(0); packet.WriteByte(0); packet.WriteByte(0); packet.WriteShort(0); pClient.SendPacket(packet); packet = new Packet(EOpcode.SMSG_WORLD_LIST); packet.WriteByte(0xFF); pClient.SendPacket(packet); }
public Player(Client pClient, DatabaseQuery pQuery) { mClient = pClient; mRandom = new Random(); mIdentifier = (int)pQuery["identifier"]; mName = (string)pQuery["name"]; mGender = (byte)pQuery["gender"]; mSkin = (byte)pQuery["skin"]; mEyesIdentifier = (int)pQuery["eyes_identifier"]; mHairIdentifier = (int)pQuery["hair_identifier"]; mLevel = (byte)pQuery["level"]; mJob = (ushort)pQuery["job"]; mStrength = (ushort)pQuery["strength"]; mDexterity = (ushort)pQuery["dexterity"]; mIntellect = (ushort)pQuery["intellect"]; mLuck = (ushort)pQuery["luck"]; mHealth = (ushort)pQuery["health"]; mMaxHealth = (ushort)pQuery["max_health"]; mMana = (ushort)pQuery["mana"]; mMaxMana = (ushort)pQuery["max_mana"]; mAbilityPoints = (ushort)pQuery["ability_points"]; mSkillPoints = (ushort)pQuery["skill_points"]; mExperience = (int)pQuery["experience"]; mFame = (ushort)pQuery["fame"]; int mapIdentifier = (int)pQuery["map_identifier"]; MapData mapData = Server.GetMapData(mapIdentifier); byte spawn = (byte)pQuery["map_spawn"]; if (mapData.ForcedReturnMapIdentifier != MapData.INVALID_MAP_IDENTIFIER) { mapData = Server.GetMapData(mapData.ForcedReturnMapIdentifier); spawn = 0; if (mHealth == 0) mHealth = 50; } else if (mHealth == 0) { mapData = Server.GetMapData(mapData.ReturnMapIdentifier); spawn = 0; mHealth = 50; } mMap = Server.GetActiveMap(mapData.Identifier); mSpawn = spawn; mPosition = new Coordinates(mapData.Portals[spawn].X, mapData.Portals[spawn].Y); using (DatabaseQuery query = Database.Query("SELECT * FROM player_item WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { byte[] slots = new byte[(byte)EInventoryType.Count]; slots[(byte)EInventoryType.Equipment] = (byte)pQuery["equipment_slots"]; slots[(byte)EInventoryType.Use] = (byte)pQuery["use_slots"]; slots[(byte)EInventoryType.Setup] = (byte)pQuery["setup_slots"]; slots[(byte)EInventoryType.Etc] = (byte)pQuery["etc_slots"]; slots[(byte)EInventoryType.Cash] = (byte)pQuery["cash_slots"]; mItems = new PlayerItems((int)pQuery["mesos"], slots, query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_skill WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { mSkills = new PlayerSkills(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_quest WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { mQuests = new PlayerQuests(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_teleport WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { mTeleports = new PlayerTeleports(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_card WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { mCards = new PlayerCards(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_macro WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { mMacros = new PlayerMacros(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_keymap WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { query.NextRow(); mKeymap = new PlayerKeymap(query); } using (DatabaseQuery query = Database.Query("SELECT * FROM player_buddy WHERE player_identifier=@player_identifier", new MySqlParameter("@player_identifier", mIdentifier))) { mBuddies = new PlayerBuddies((byte)pQuery["buddy_slots"], query); } }