public int GetCharacterExpForTimeline() { if (CharData == null) { return(0); } float fullPercent = EXPTable.GetLevelPercentage(this.CharData.Stats.Level, this.CharData.Stats.EXP); return((int)Math.Round(fullPercent * 100)); }
public override void HandleStatUpdate(ClientConnection pConnection, MaplePacket pPacket) { pPacket.ReadByte(); long updateFlag = pPacket.ReadLong(); if (updateFlag == 0) { return; // Fake Update -.- / Unstuck } bool didsomething = false; if (CheckFlag(updateFlag, 1)) // Skin { didsomething = true; pConnection.CharData.Stats.Skin = pPacket.ReadByte(); } if (CheckFlag(updateFlag, 2)) // Eyes { didsomething = true; pConnection.CharData.Stats.Face = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 4)) // Eyes { didsomething = true; pConnection.CharData.Stats.Hair = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 0x10)) { didsomething = true; var level = pPacket.ReadByte(); Timeline.Instance.PushLevelUP(pConnection, level); pConnection.CharData.Stats.Level = level; pConnection.Logger_WriteLine("{0} leveled up to level {1}!!!", pConnection.CharData.Stats.Name, level); } if (CheckFlag(updateFlag, 0x20)) { didsomething = true; var jobid = pPacket.ReadShort(); Timeline.Instance.PushJobUP(pConnection, (ushort)jobid); pConnection.CharData.Stats.JobID = jobid; pConnection.Logger_WriteLine("{0} changed to job {1}!!!", pConnection.CharData.Stats.Name, jobid); } if (CheckFlag(updateFlag, 0x40)) { didsomething = true; pConnection.CharData.Stats.Str = pPacket.ReadShort(); } if (CheckFlag(updateFlag, 0x80)) { didsomething = true; pConnection.CharData.Stats.Dex = pPacket.ReadShort(); } if (CheckFlag(updateFlag, 0x100)) { didsomething = true; pConnection.CharData.Stats.Int = pPacket.ReadShort(); } if (CheckFlag(updateFlag, 0x200)) { didsomething = true; pConnection.CharData.Stats.Luk = pPacket.ReadShort(); } if (CheckFlag(updateFlag, 0x400)) { didsomething = true; pConnection.CharData.Stats.HP = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 0x800)) { didsomething = true; pConnection.CharData.Stats.MaxHP = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 0x1000)) { didsomething = true; pConnection.CharData.Stats.MP = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 0x2000)) { didsomething = true; pConnection.CharData.Stats.MaxMP = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 0x4000)) { didsomething = true; pConnection.CharData.Stats.AP = pPacket.ReadShort(); } if (CheckFlag(updateFlag, 0x8000)) { didsomething = true; short a1 = pConnection.CharData.Stats.JobID; pConnection.CharData.Stats.SPData.Clear(); if (GameHelper.IsExtendedSPJob(pConnection.CharData.Stats.JobID)) { byte amnt = pPacket.ReadByte(); List <byte> haslist = new List <byte>(); for (int j = 0; j < amnt; j++) { byte v1 = pPacket.ReadByte(); // Job ID int v2 = pPacket.ReadInt(); // Amount pConnection.CharData.Stats.SPData.Add(new KeyValuePair <byte, int>(v1, v2)); haslist.Add(v1); } for (byte j = 1; j < 20; j++) { if (!haslist.Contains(j)) { pConnection.CharData.Stats.SPData.Add(new KeyValuePair <byte, int>(j, 0)); } } } else { pConnection.CharData.Stats.SPData.Add(new KeyValuePair <byte, int>(0, pPacket.ReadShort())); } } if (CheckFlag(updateFlag, 0x10000)) { didsomething = true; long newexp = pPacket.ReadLong(); byte point = (byte)EXPTable.GetLevelPercentage(pConnection.CharData.Stats.Level, newexp); if (pConnection.LastExpPoint != point) { // Ohhh Timeline.Instance.PushExpPoint(pConnection, point); } pConnection.CharData.Stats.EXP = newexp; pConnection.LastExpPoint = point; } if (CheckFlag(updateFlag, 0x20000)) { didsomething = true; int fame = pPacket.ReadInt(); Timeline.Instance.PushGotFame(pConnection, fame - pConnection.CharData.Stats.Fame, fame); pConnection.CharData.Stats.Fame = fame; } if (CheckFlag(updateFlag, 0x40000)) { didsomething = true; pConnection.CharData.Stats.Mesos = pPacket.ReadLong(); } // EMS Weird stuff if (CheckFlag(updateFlag, 0x80000)) { var value = pPacket.ReadLong(); pConnection.Logger_WriteLine("0x80000 | {0}", value); } if (CheckFlag(updateFlag, 0x100000)) { var value = pPacket.ReadByte(); pConnection.Logger_WriteLine("0x100000 | {0}", value); } if (CheckFlag(updateFlag, 0x200000)) { // Ambition/Charisma D: pConnection.CharData.Stats.Traits[(int)GW_CharacterStat.TraitVals.Charisma] = pPacket.ReadInt(); } if (CheckFlag(updateFlag, 0x400000)) { pConnection.CharData.Stats.Traits[(int)GW_CharacterStat.TraitVals.Insight] = pPacket.ReadInt(); didsomething = true; } if (CheckFlag(updateFlag, 0x800000)) { pConnection.CharData.Stats.Traits[(int)GW_CharacterStat.TraitVals.Willpower] = pPacket.ReadInt(); didsomething = true; } if (CheckFlag(updateFlag, 0x1000000)) { pConnection.CharData.Stats.Traits[(int)GW_CharacterStat.TraitVals.CraftDiligence] = pPacket.ReadInt(); didsomething = true; } if (CheckFlag(updateFlag, 0x2000000)) { pConnection.CharData.Stats.Traits[(int)GW_CharacterStat.TraitVals.Empathy] = pPacket.ReadInt(); didsomething = true; } if (CheckFlag(updateFlag, 0x4000000)) { pConnection.CharData.Stats.Traits[(int)GW_CharacterStat.TraitVals.Charm] = pPacket.ReadInt(); didsomething = true; } if (CheckFlag(updateFlag, 0x8000000)) { pPacket.ReadBytes(21); } if (CheckFlag(updateFlag, 0x10000000)) { pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadByte(); } if (CheckFlag(updateFlag, 0x20000000)) { for (byte i = 0; i < 9; i++) { pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadInt(); } } if (CheckFlag(updateFlag, 0x40000000)) { var value1 = pPacket.ReadInt(); var value2 = pPacket.ReadByte(); var value3 = pPacket.ReadInt(); pConnection.Logger_WriteLine("0x40000000 | {0} | {1} | {2}", value1, value2, value3); } if (CheckFlag(updateFlag, 0x80000000)) { var value1 = pPacket.ReadByte(); var value2 = pPacket.ReadByte(); pConnection.Logger_WriteLine("0x80000000 | {0} | {1}", value1, value2); } if (CheckFlag(updateFlag, 0x100000000)) { var value = pPacket.ReadInt(); pConnection.Logger_WriteLine("0x100000000 | {0}", value); } if (CheckFlag(updateFlag, 0x200000000)) { var value = pPacket.ReadInt(); pConnection.Logger_WriteLine("0x200000000 | {0}", value); } if (didsomething) { pConnection.CharData.SaveCharacterInfo(pConnection); pConnection.SendTimeUpdate(); } }
static void Main(string[] args) { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnexpectedExHandler); Console.CancelKeyPress += Console_CancelKeyPress; Logger.SetLogfile(false); MasterThread.Load("MPLRServer"); try { MySQL_Connection.Initialize(); } catch { Environment.Exit(12); } AccountDataCache.Initialize(); #if LOCALE_GMS GMSKeys.Initialize(); #endif CommandHandler.Initialize(); Timeline.Init(); Random = new System.Random(); { InitializeValidHeaders(); AcceptedIPs = new List <string>(); #if LOCALE_GMS AcceptedIPs.Add("8.31.9"); // GMS #elif LOCALE_EMS AcceptedIPs.Add("109.234.77"); // EMS #endif Clients = new List <ClientConnection>(); StartPinger(); StartCharacterDeleteQueue(); } EXPTable.Load(); SessionRestartCache.Start(); // For clients Acceptor accept = new Acceptor(ServerMapleInfo.MAPLER_PORT, sock => { new ClientConnection(sock); }); // For online check! byte[] OnlineCheckInfo = null; { MaplePacket packet = new MaplePacket(ServerMapleInfo.VERSION); packet.WriteByte(ServerMapleInfo.LOCALE); byte[] temp = packet.ToArray(); OnlineCheckInfo = new byte[temp.Length + 1]; Buffer.BlockCopy(temp, 0, OnlineCheckInfo, 1, temp.Length); OnlineCheckInfo[0] = (byte)(temp.Length + 4); packet.Dispose(); packet = null; } Acceptor acceptCheck = new Acceptor(ServerMapleInfo.MAPLER_PORT_SERVER_INFO, sock => { sock.Send(OnlineCheckInfo); sock.Send(BitConverter.GetBytes(Clients.Count)); sock.Shutdown(System.Net.Sockets.SocketShutdown.Both); sock.Close(); }); Logger.WriteLine("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); Logger.WriteLine("| |"); Logger.WriteLine("| Mapler.me Server |"); Logger.WriteLine("| |"); #if LOCALE_GMS Logger.WriteLine("| GLOBAL |"); #elif LOCALE_EMS Logger.WriteLine("| EUROPE |"); #elif LOCALE_KMS Logger.WriteLine("| KOREA |"); #endif Logger.WriteLine("| |"); Logger.WriteLine("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); Logger.WriteLine("| Build For: {0,3} Locale {1,1} |", ServerMapleInfo.VERSION, ServerMapleInfo.LOCALE); Logger.WriteLine("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); Logger.WriteLine("Accepting connections on {0}, and info requests on {1}", ServerMapleInfo.MAPLER_PORT, ServerMapleInfo.MAPLER_PORT_SERVER_INFO); while (true) { string cmd = Console.ReadLine(); if (cmd == null) { break; // CTRL + C } string[] arguments = cmd.Split(' '); if (arguments.Length >= 1) { switch (arguments[0]) { #if LOCALE_GMS case "getkeys": { GMSKeys.Initialize(); break; } #endif case "reload_store": { MasterThread.Instance.AddCallback(a => { AccountDataCache.Instance.Load(); }); break; } case "request_screenshots": { MasterThread.Instance.AddCallback(a => { var tmp = new List <ClientConnection>(Clients); foreach (var client in tmp) { using (MaplePacket pack = new MaplePacket(MaplePacket.CommunicationType.ServerPacket, 0xEEFE)) { pack.SwitchOver(); client.SendPacket(pack); } } }); break; } case "testsession": { int accountid = arguments.Length > 1 ? Int32.Parse(arguments[1]) : -1; bool raw = arguments.Length > 2; var verp = new MSBLoader(); var connection = new ClientConnection(verp); connection.AccountID = accountid; verp.Parse("Savefile.msb", raw); break; } case "players": { string names = string.Join(", ", Clients); Console.WriteLine("Players online:\r\n{0}", names); break; } case "close": case "stop": case "exit": { MasterThread.Instance.AddCallback(a => { var tmp = new List <ClientConnection>(Clients); foreach (var client in tmp) { // client.Save(true, true); client.Disconnect(); } MySQL_Connection.Instance.Stop = true; MasterThread.Instance.Stop = true; }); break; } default: Console.WriteLine("Command not found"); break; } } } }