예제 #1
0
        public void SpawnPlayerAtProperty(Session.Session session, string propertyId)
        {
            PropertyModel property;

            if ((property = GetProperty(propertyId)) == null)
            {
                return;
            }

            Log.Verbose($"Spawning {session.PlayerName} at property {property.Address} ({propertyId})");

            session.SetPlayerPosition(property.EntranceLocation);
        }
        public void OnPlayerDisconnect(Session.Session playerSession, string reason)
        {
            var playerBank = GetBank(playerSession.GetGlobalData <int>("Character.CharID"));

            if (playerBank == null)
            {
                return;
            }

            saveBankAccount(playerBank);
            currentAccounts.Remove(playerBank);
            Log.Verbose($"Removed {playerSession.PlayerName}'s bank account ({playerBank.AccountID}) due to them disconnecting");
        }
예제 #3
0
        public string GetTwitterHandle(Session.Session playerSession)
        {
            var playerSettings   = playerSession./*GetCharacterSettings()*/ CharacterSettings;
            var hasTwitterHandle = playerSettings.ContainsKey("TwitterHandle");
            var twitterHandle    = $"{playerSession.GetGlobalData("Character.FirstName", "")}_{playerSession.GetGlobalData("Character.LastName", "")}";

            if (hasTwitterHandle)
            {
                twitterHandle = playerSettings["TwitterHandle"];
            }

            return("@" + twitterHandle);
        }
        private void desyncStorage(Session.Session session)
        {
            if (this.StorageLocation != default)
            {
                Log.Verbose($"Desyncing storage for {session.PlayerName} for property {PropertyId}");

                var storages = session.AccessablePropertyStorages;
                storages.Remove(StorageLocation);
                session.AccessablePropertyStorages = storages;

                session.RemoveMarker($"property:storage:{PropertyId}");
            }
        }
예제 #5
0
파일: Reply.cs 프로젝트: FlyApple/XSNetwork
        public void FreeSession(Session.Session session)
        {
            if (session != null)
            {
                if (session.IsUsing)
                {
                    session.dispose();
                }

                m_SessionPool.Free((T)session);
                session = null;
            }
        }
예제 #6
0
        public void NotOnCharacterLoaded(Session.Session playerSession)
        {
            var playerSettings = playerSession./*GetPlayerSettings()*/ PlayerSettings;

            if (!playerSettings.ContainsKey("Interaction.Menu.X") || !playerSettings.ContainsKey("Interaction.Menu.Y"))
            {
                playerSettings["Interaction.Menu.X"] = 1010;
                playerSettings["Interaction.Menu.Y"] = 13;
                playerSession./*SetPlayerSettings()*/ PlayerSettings = playerSettings;
            }

            playerSession.TriggerEvent("UI.UpdateInteractionMenuLocation", playerSettings["Interaction.Menu.X"], playerSettings["Interaction.Menu.Y"]);
        }
        private async void StartRobberyThread(Session.Session robberSession, Session.Session victimSession)
        {
            var robberyCash = victimSession.GetGlobalData("Character.Cash", 0);

            if (robberyCash == 0)
            {
                Log.ToClient("[Robbery]", "You found no cash", ConstantColours.Blue, robberSession.Source);
                Log.ToClient("[Robbery]", "The robber found no cash on you", ConstantColours.Blue, victimSession.Source);
                victimSession.SetLocalData("Character.IsBeingRobbed", false);
                return;
            }

            var robberyWaitTimer = CitizenFX.Core.Native.API.GetConvarInt("mg_playerRobbingTime", 6);

            while (robberyWaitTimer > 0)
            {
                var robberPos = robberSession.GetPlayerPosition();
                var victimPos = victimSession.GetPlayerPosition();

                Log.Debug($"Robbery between {robberSession.PlayerName} and {victimSession.PlayerName} distance = {robberPos.DistanceToSquared(victimPos)}");
                if (robberPos.DistanceToSquared(victimPos) > 4.0f)
                {
                    Log.ToClient("[Robbery]", "You moved to far away to finish the robbery", ConstantColours.Blue, robberSession.Source);
                    Log.ToClient("[Robbery]", "You moved away and are no longer being robbed", ConstantColours.Blue, victimSession.Source);
                    victimSession.SetLocalData("Character.IsBeingRobbed", false);

                    return;
                }

                if (!victimSession.GetGlobalData("Character.HasHandsUp", false) && !victimSession.GetGlobalData("Character.HasHandsOverHead", false) && /*Server.Get<ArrestHandler>().GetCuffState(victimSession)*/ victimSession.CuffState == CuffState.None && /*Server.Get<DeathHandler>().GetDeathState(victimSession)*/ victimSession.DeathState == DeathState.Alive)
                {
                    Log.ToClient("[Robbery]", "The person you are robbing put their hands down", ConstantColours.Blue, robberSession.Source);
                    Log.ToClient("[Robbery]", "You put your hands down", ConstantColours.Blue, victimSession.Source);
                    victimSession.SetLocalData("Character.IsBeingRobbed", false);

                    return;
                }

                await BaseScript.Delay(1000);

                robberyWaitTimer--;
            }

            var payHandler = Server.Get <PaymentHandler>();

            payHandler.UpdatePlayerCash(robberSession, robberyCash, $"robbing {victimSession.PlayerName}");
            payHandler.UpdatePlayerCash(victimSession, -robberyCash, $"being robbed by {robberSession.PlayerName}");

            Log.ToClient("[Robbery]", $"You just robbed this person for ${robberyCash}", ConstantColours.Blue, robberSession.Source);
            Log.ToClient("[Robbery]", $"You just got robbed for ${robberyCash}", ConstantColours.Blue, victimSession.Source);
        }
예제 #8
0
        public static void SendProximityMessage(Session.Session sourceSession, string prefix, string message, Color prefixColour, float distance = 6.0f, bool showForSource = true)
        {
            var sourcePos = sourceSession.GetPlayerPosition();

            Server.Instance.Get <SessionManager>().ForAllClients(o =>
            {
                var playerPos = o.Position;

                if (sourcePos.DistanceToSquared(playerPos) <= distance && (showForSource || sourceSession != o))
                {
                    Log.ToClient(prefix, message, prefixColour, o.Source);
                }
            });
        }
예제 #9
0
        public void SendRadioMessage(Session.Session sourceSession, int radioChannel, string radioMessage)
        {
            Sessions.ForAllClients(o =>
            {
                var otherRadioChannel = GetPlayerRadioChannel(o);

                if (radioChannel == otherRadioChannel)
                {
                    Log.ToClient($"[Radio Channel {radioChannel}]", radioMessage, ConstantColours.Radio, o.Source);
                }
            });
            Messages.SendProximityMessage(sourceSession, "[On Radio]", radioMessage, ConstantColours.Radio, 25.0f, false);
            sourceSession.TriggerEvent("Player.PlayRadioAnim");
        }
예제 #10
0
        public void OnCharacterLoaded(Session.Session playerSession)
        {
            var properties = Server.Get <PropertyManager>().Properties.Where(o => o.IsPropertyTenant(playerSession.CharId));

            foreach (var property in properties)
            {
                var daysUntilPay = getDaysUntilNextPayment(property);

                if (daysUntilPay == 0)
                {
                    playerSession.Message("[Property]", $"Payment for {property.Address} is due today (${GetPropertyNextPaymentPrice(property)})");
                }
            }
        }
예제 #11
0
파일: Schema.cs 프로젝트: DenisAloner/crane
        public byte[] Handle(string query, Session.Session session)
        {
            string id       = null;
            var    data     = new JArray();
            var    response = new Response(session);
            var    pos      = query.IndexOf("#");

            if (pos != -1)
            {
                id    = query.Substring(0, pos);
                query = query.Substring(pos + 1);
                var gqlQuery = ParseQueries(query, response);
                if (!response.Errors.HasValues)
                {
                    foreach (var value in gqlQuery)
                    {
                        if (value.TargetType is GqlQuery q)
                        {
                            var errorsCount = response.Errors.Count;
                            var answer      = q.Resolve(value, response);
                            if (errorsCount == response.Errors.Count)
                            {
                                data.Add(answer);
                            }
                        }
                        else
                        {
                            response.AddError(value.ToString(), "Запрашиваемый метод не найден");
                        }
                    }
                }
            }
            else
            {
                response.AddError(query, "Идентификатор не указан");
            }
            var result = new JObject {
                new JProperty("data", data.HasValues ? data : null)
            };

            if (id != null)
            {
                result.Add(new JProperty("id", id));
            }
            if (response.Errors.HasValues)
            {
                result.Add(new JProperty("errors", response.Errors));
            }
            return(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result)));
        }
예제 #12
0
        private void Event_AsyncAccept(object sender, SocketAsyncEventArgs args)
        {
            if (args.SocketError != SocketError.Success)
            {
                args.AcceptSocket.Close();
                args.AcceptSocket.Dispose();
                args.AcceptSocket = null;
                return;
            }

            Session.Session session = this.AllocSession();
            if (session == null)
            {
                args.AcceptSocket.Close();
                args.AcceptSocket.Dispose();

                Error(-1, "[Error] : alloc session is null.");
            }
            else
            {
                if (session.FreeSessionCaller == null ||
                    !session.FreeSessionCaller.Equals(new Base.FreeSessionMethodCaller(FreeSessionCaller)))
                {
                    session.FreeSessionCaller += new Base.FreeSessionMethodCaller(FreeSessionCaller);
                }

                if (!session.initialize(args.AcceptSocket, (IPEndPoint)m_Socket.LocalEndPoint, (IPEndPoint)args.AcceptSocket.RemoteEndPoint))
                {
                    this.FreeSession((T)session);

                    args.AcceptSocket.Close();
                    args.AcceptSocket.Dispose();

                    Error(-1, "[Error] : session(" + session.Index + ") : initialize fail.");
                }
                else
                {
                    if (!this.ProcessAccept(session))
                    {
                        session.close(true);

                        this.FreeSession((T)session);
                    }
                }
            }

            //C# 存在隐藏的指针,Are you kidding me?
            //如果定义成数组,这里是指针哦!
            args.AcceptSocket = null;
        }
예제 #13
0
        private SocketEventProvider(Session.Session session)
        {
            Sending = false;

            ReceiveEvent            = socketEventPool.Pop();
            ReceiveEvent.UserToken  = session;
            ReceiveEvent.Completed += ReceiveSocketEvent_Completed;

            // TODO: Memory Manager
            ReceiveEvent.SetBuffer(new byte[MaxBufferSize]);

            SendEvent            = socketEventPool.Pop();
            SendEvent.UserToken  = session;
            SendEvent.Completed += SendSocketEvnet_Completed;
        }
예제 #14
0
        public async Task Add(INetworkClient client)
        {
            var session = new Session.Session(client);

            lock (m_Lock)
            {
                Sessions.Add(session);
            }

            session.DependencyManager = m_DependencyManager.CreateChildContainer();

            await OnSessionCreated(session);

            //await Invoke(new ConnectedEvent(), client.Id, m_Empty);
        }
예제 #15
0
        private void OnDataRequest([FromSource] Player source, int vehId)
        {
            Session.Session playerSession = Sessions.GetPlayer(source);
            if (playerSession == null)
            {
                return;
            }

            Log.Verbose($"Attempting to load vehicle ({vehId}) for {source.Name} (CharID: {playerSession.GetGlobalData<int>("Character.CharID")})");
            MySQL.execute("SELECT * FROM vehicle_data WHERE VehID = @id", new Dictionary <string, dynamic>
            {
                ["@id"] = vehId
            }, new Action <List <dynamic> >(data =>
            {
                if (data[0].Impounded)
                {
                    RetrieveImpoundVehicle(playerSession, data[0]);
                    return;
                }

                //VehicleDataModel modData = JsonConvert.DeserializeObject<VehicleDataModel>(data[0].Mods);
                var didParse = ((string)data[0].Mods).TryParseJson(out VehicleDataModel modData);

                if (!didParse)
                {
                    modData = new VehicleDataModel();
                }

                try
                {
                    modData.Model = CitizenFX.Core.Native.API.GetHashKey(VehicleStoreItems.StoreMenus.FirstOrDefault(o => o.Value.FirstOrDefault(b => b.displayName == data[0].VehicleName) != null).Value.FirstOrDefault(o => o.displayName == data[0].VehicleName)?.modelName);
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }

                source.TriggerEvent("Vehicle.SpawnGarageVehicle", data[0].Plate, data[0].VehID, /*data[0].Mods*/ JsonConvert.SerializeObject(modData));
                currentVehicles.Add(new Models.Vehicle(data[0], playerSession));
                AddPlayerOwnedVehicle(playerSession, data[0].VehID);
                MySQL.execute("UPDATE vehicle_data SET OutGarage = true WHERE VehID = @id", new Dictionary <string, dynamic>
                {
                    ["@id"] = vehId
                });

                Log.Verbose($"Loaded vehicle ({vehId}) for {source.Name} (CharID: {playerSession.GetGlobalData<int>("Character.CharID")})");
            }));
        }
예제 #16
0
 // Gets all impounded vehicles of a players current character
 private void GetImpoundVehicles(Session.Session playerSession)
 {
     Log.Verbose($"Requesting impounded vehicle data for {playerSession.PlayerName} (CharID: {playerSession.GetGlobalData<int>("Character.CharID")})");
     MySQL.execute("SELECT * FROM vehicle_data WHERE CharID = @char AND Impounded = true", new Dictionary <string, dynamic>
     {
         ["@char"] = playerSession.GetGlobalData <int>("Character.CharID"),
     }, new Action <List <dynamic> >(data =>
     {
         data.ForEach(o =>
         {
             ((IDictionary <string, dynamic>)o)["ImpoundPrice"] = o.VehiclePrice * 0.1f;
         });
         playerSession.TriggerEvent("Vehicle.RecieveGarageVehicles", data, true);
         Log.Verbose($"Got impounded vehicle data for player {playerSession.PlayerName} (CharID: {playerSession.GetGlobalData<int>("Character.CharID")})");
     }));
 }
        public void UpdateJailState(Session.Session session)
        {
            var jailTime = session.GetGlobalData("Character.JailTime", 0);

            if (jailTime > 0 && !session.GetLocalData("Jail.IsInJail", false))
            {
                session.SetServerData("Jail.LastJailReduction", DateTime.Now);
                session.SetLocalData("Jail.IsInJail", true);
                session.TriggerEvent("Jail.SetJailState", true);
            }
            else if (jailTime <= 0 && session.GetLocalData("Jail.IsInJail", false))
            {
                session.TriggerEvent("Jail.SetJailState", false);
                session.SetLocalData("Jail.IsInJail", false);
            }
        }
        public async void OnCharacterLoaded(Session.Session playerSession)
        {
            if (string.IsNullOrEmpty(playerSession.GetGlobalData("Character.SkinData", "")))
            {
                Log.Debug($"{playerSession.PlayerName} is starting initial creation of a character");
                await playerSession.Transition(600, 1500, 600);

                playerSession.SetGlobalData("Character.Instance", playerSession.ServerID);
                playerSession.SetServerData("Character.Skin.PreviousLocation", playerSession.GetPlayerPosition());
                playerSession.SetPlayerPosition(skinCreationLocation);
                playerSession.SetPlayerHeading(331.0f);
                playerSession.TriggerEvent("Skin.StartCharacterCreation");

                playerSession.SetFreezeStatus(true);
            }
        }
        private void AddPolyPoint(Session.Session playerSession)
        {
            if (playerSession.GetServerData("Dev.IsDrawingPoly", false))
            {
                var playerPos = playerSession.GetPlayerPosition();
                var polyPos   = new[] { playerPos.X, playerPos.Y };

                Log.Debug($"Adding a position of X: {polyPos[0]} Y: {polyPos[1]} for {playerSession.PlayerName} current poly");
                Log.ToClient("[Dev]", $"Adding position X: {polyPos[0]} Y: {polyPos[1]}", ConstantColours.Admin, playerSession.Source);
                var currentPolys = playerSession.GetServerData("Dev.PolyPoints", new List <float[]>());
                currentPolys.Add(polyPos);

                playerSession.SetServerData("Dev.PolyPoints", currentPolys);
                playerSession.TriggerEvent("Dev.Poly.AddDrawingPoint", polyPos);
            }
        }
        public JobType GetPlayerJob(Session.Session playerSession)
        {
            if (playerSession == null)
            {
                return(JobType.Civillian);
            }

            var tempJob = playerSession.GetGlobalData("Character.Temp.Job", "-1");

            if (tempJob != "-1")
            {
                return(stringToJob(tempJob));
            }

            return(stringToJob(playerSession.GetGlobalData("Character.Job", "Civillian")));
        }
        public void OnCharacterLoaded(Session.Session playerSession)
        {
            var characterSettings = playerSession./*GetCharacterSettings()*/ CharacterSettings;

            if (characterSettings.ContainsKey("SpawnLocation"))
            {
                string location = characterSettings["SpawnLocation"];
                if (!location.Contains("home")) // TODO make this less hard-codey
                {
                    playerSession.SetPlayerPosition(spawnLocations[location]);
                    return;
                }

                Server.Get <PropertyManager>().SpawnPlayerAtProperty(playerSession, location.Split('-')[1]);
            }
        }
        /// <summary>
        /// Lists all permissions the player currently has. Splitting them up by their respective branches
        /// </summary>
        /// <param name="playerSession"></param>
        public static void ListPermissions(this Session.Session playerSession)
        {
            var perms = playerSession.Permissions;

            var playerPermTrees = PermissionTree.CreateTrees(perms);

            foreach (var tree in playerPermTrees)
            {
                Log.Info($"Permission tree - {tree.Name} start");
                foreach (var perm in tree.Permissions)
                {
                    Log.Info(perm);
                }
                Log.Info($"Permission tree - {tree.Name} end");
            }
        }
예제 #23
0
        public int GetPlayerRadioChannel(Session.Session playerSession)
        {
            var radioItem = playerSession./*GetInventory()*/ Inventory.GetItem("Radio");

            if (radioItem != null)
            {
                if (radioItem.metaData != "")
                {
                    return(Convert.ToInt32(radioItem.metaData));
                }

                return(1);
            }

            return(-1);
        }
        private void syncMarkers(Session.Session session)
        {
            if (this.EntranceLocation != default)
            {
                session.AddMarker(this.EntranceLocation, new MarkerOptions
                {
                    ColorArray = ConstantColours.Yellow.ToArray(),
                    MarkerId   = $"property:entrance:{PropertyId}"
                });
            }

            if (IsPropertyTenant(session.CharId))
            {
                session.AddGarage(getPropertyGarage());                                  // only sync garage if they are an actual tenant
            }
        }
        public void ResyncPropertyForPlayer(Session.Session playerSession, bool skipChecks = true)
        {
            if (playerSession == null || !skipChecks && !IsPropertyTenant(playerSession.CharId))
            {
                return;
            }

            Log.Debug($"Syncing property {PropertyId} for {playerSession.PlayerName}");

            syncMarkers(playerSession);

            if (playerSession.PropertyCurrentlyInside != null && playerSession.PropertyCurrentlyInside == this)
            {
                syncStorage(playerSession);
            }
        }
예제 #26
0
        public int GetPaymentTypeBalance(Session.Session playerSession)
        {
            var paymentType = GetPaymentType(playerSession);

            if (paymentType == PaymentType.Cash)
            {
                return(playerSession.GetGlobalData("Character.Cash", 0));
            }

            if (paymentType == PaymentType.Debit)
            {
                return(Server.Get <BankHandler>().GetBank(playerSession.GetGlobalData <int>("Character.CharID")).Balance);
            }

            return(0);
        }
예제 #27
0
        private async void beginDrugInteraction(Session.Session playerSession, Drug drugData, Vector3 closeVector, bool isHarvest)
        {
            var drugName        = isHarvest ? drugData.HarvestDrugName : drugData.ProcessDrugName;
            var interactionTime = GetPoliceMult(isHarvest ? drugData.HarvestTime : drugData.ProcessTime, 1.5f);

            var remainingTime = interactionTime;

            while (true)
            {
                await BaseScript.Delay(250);

                remainingTime -= 250;

                if (remainingTime <= 0)
                {
                    var playerInv = playerSession./*GetInventory()*/ Inventory;
                    if (isHarvest && playerInv.CanStoreItem(drugName, 1) || !isHarvest && playerInv.HasItem(drugData.HarvestDrugName))
                    {
                        Log.ToClient("[Drugs]", $"You just got 1 {drugName}", ConstantColours.Criminal, playerSession.Source);
                        if (!isHarvest)
                        {
                            playerInv.AddItem(drugData.HarvestDrugName, -1);
                        }
                        playerInv.AddItem(drugName, 1);
                    }
                    else
                    {
                        Log.ToClient("[Drugs]", $"You cannot hold anymore {drugName}", ConstantColours.Criminal, playerSession.Source);
                        playerSession.SetServerData("Drug.IsInteracting", false);
                        return;
                    }

                    remainingTime = interactionTime;
                }
                else
                {
                    var playerPos = playerSession.GetPlayerPosition();

                    if (playerPos.DistanceToSquared(closeVector) > 15.0f || playerSession.IsInVehicle())
                    {
                        Log.ToClient("[Drugs]", "You moved to far away from the drug area", ConstantColours.Criminal, playerSession.Source);
                        playerSession.SetServerData("Drug.IsInteracting", false);
                        return;
                    }
                }
            }
        }
예제 #28
0
        public void OnCharacterLoaded(Session.Session playerSession)
        {
            playerSession.AddBlip("Fish seller", fishSellLocations, new BlipOptions
            {
                Sprite = 356
            });
            playerSession.AddMarker(fishSellLocations, new MarkerOptions
            {
                ScaleFloat = 2.0f,
                ColorArray = ConstantColours.Yellow.ToArray()
            });

            playerSession.AddBlip("Fishing pier", fishingLocations, new BlipOptions
            {
                Sprite = 316
            });
        }
        private void UpdateDragState(Session.Session playerSession, DragState dragState, int ownerId)
        {
            playerSession.SetGlobalData(new Dictionary <string, dynamic>
            {
                ["Character.DragState"]   = dragState.ToString(),
                ["Drag.CurrentDragOwner"] = ownerId
            });

            if (dragState == DragState.None || ownerId == -1)
            {
                playerSession.TriggerEvent("Drag.EndDrag");
            }
            else if (dragState == DragState.Dragged)
            {
                playerSession.TriggerEvent("Drag.DoDrag", ownerId);
            }
        }
예제 #30
0
        public Vehicle(IDictionary <string, dynamic> data, Session.Session vehOwner)
        {
            var vehType = GetType();

            foreach (var kvp in data)
            {
                try
                {
                    var field = vehType.GetProperty(kvp.Key);
                    //Log.Debug($"Currently doing stuff for {kvp.Key}");
                    if (field != null)
                    {
                        //Log.Debug($"{kvp.Key} exists in this object!");
                        if (kvp.Key == "Mods")
                        {
                            if (kvp.Value.Contains("{"))
                            {
                                field.SetValue(this, JsonConvert.DeserializeObject <VehicleDataModel>(kvp.Value));
                            }
                            else
                            {
                                field.SetValue(this, new VehicleDataModel());
                            }
                            Log.Debug($"Settings mods");
                        }
                        else if (kvp.Key == "Inventory")
                        {
                            field.SetValue(this, new VehicleInventory(kvp.Value, this));
                            Log.Debug($"Setting inventory with an inv string of {kvp.Value}");
                        }
                        else
                        {
                            field.SetValue(this, kvp.Value);
                            Log.Debug($"Setting generic value of {kvp.Key}");
                        }
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
            }

            VehicleOwner = vehOwner;
            KeyAccessCharacters.Add(vehOwner.GetGlobalData <int>("Character.CharID"));
        }