示例#1
0
        public void StopListening(GraphStack stack)
        {
            var data = stack.GetElementData <Data>(this);

            if (data.UpdateAction == null)
            {
                return;
            }

            var hook = new EventHook(EventHooks.Update, stack.machine);

            EventBus.Unregister(hook, data.UpdateAction);

            if (data.IsOpened)
            {
                data.Close();
            }
            data.UpdateAction = null;
        }
示例#2
0
 /// <summary>
 /// Add sync for doors on the vehicle.
 /// </summary>
 void AddVehicleDoorSync()
 {
     Transform[] children = ParentGameObject.GetComponentsInChildren <Transform>();
     foreach (Transform child in children)
     {
         // Rear door of van, trunk of old car and Ferndale.
         if (child.name == "RearDoor")
         {
             child.gameObject.AddComponent <ObjectSyncComponent>().Setup(ObjectSyncManager.ObjectTypes.VehicleDoor, ObjectSyncManager.AUTOMATIC_ID);
         }
         else if (child.name == "Bootlid")
         {
             child.gameObject.AddComponent <ObjectSyncComponent>().Setup(ObjectSyncManager.ObjectTypes.VehicleDoor, ObjectSyncManager.AUTOMATIC_ID);
         }
         // Side door of van
         else if (child.name == "SideDoor")
         {
             GameObject   fsmGO = child.FindChild("door").FindChild("Collider").gameObject;
             PlayMakerFSM fsm   = Utils.GetPlaymakerScriptByName(fsmGO, "Use");
             if (fsm != null)
             {
                 EventHook.AddWithSync(fsm, "Open door");
                 EventHook.AddWithSync(fsm, "Close door");
             }
         }
         // Object containing drivers doors
         else if (child.name == "DriverDoors")
         {
             // Van, Truck.
             if (child.FindChild("doorl"))
             {
                 child.FindChild("doorl").gameObject.AddComponent <ObjectSyncComponent>().Setup(ObjectSyncManager.ObjectTypes.VehicleDoor, ObjectSyncManager.AUTOMATIC_ID);
                 child.FindChild("doorr").gameObject.AddComponent <ObjectSyncComponent>().Setup(ObjectSyncManager.ObjectTypes.VehicleDoor, ObjectSyncManager.AUTOMATIC_ID);
             }
             // Ferndale.
             else if (child.FindChild("door(leftx)"))
             {
                 child.FindChild("door(leftx)").gameObject.AddComponent <ObjectSyncComponent>().Setup(ObjectSyncManager.ObjectTypes.VehicleDoor, ObjectSyncManager.AUTOMATIC_ID);
                 child.FindChild("door(right)").gameObject.AddComponent <ObjectSyncComponent>().Setup(ObjectSyncManager.ObjectTypes.VehicleDoor, ObjectSyncManager.AUTOMATIC_ID);
             }
         }
     }
 }
示例#3
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="gameObject">The game object to pickup.</param>
        public GamePlayer(GameObject gameObject)
        {
            this.gameObject = gameObject;
            Instance        = this;

            pickupFsm = Utils.GetPlaymakerScriptByName(gameObject, "PickUp");

            if (pickupFsm != null)
            {
                // Pickup events
                EventHook.Add(pickupFsm, "Part picked", new Func <bool>(() => {
                    this.PickupObject();
                    return(false);
                }));
                EventHook.Add(pickupFsm, "Item picked", new Func <bool>(() => {
                    this.PickupObject();
                    return(false);
                }));

                // Throw event
                EventHook.Add(pickupFsm, "Throw part", new Func <bool>(() => {
                    this.ThrowObject();
                    return(false);
                }));

                // Drop event
                EventHook.Add(pickupFsm, "Drop part", new Func <bool>(() => {
                    this.DropObject();
                    return(false);
                }));
            }

            GameObject trigger = GameObject.CreatePrimitive(PrimitiveType.Sphere);

            trigger.transform.localScale = new Vector3(100, 100, 100);
            trigger.GetComponent <SphereCollider>().isTrigger = true;
            GameObject.Destroy(trigger.GetComponent <MeshRenderer>());

            trigger.transform.position = gameObject.transform.position;
            trigger.transform.parent   = gameObject.transform;
            ObjectSyncPlayerComponent ospc = trigger.AddComponent <ObjectSyncPlayerComponent>();
        }
示例#4
0
        /// <summary>
        /// Hook events.
        /// </summary>
        void HookEvents()
        {
            EventHook.AddWithSync(beerCaseFSM, "Remove bottle", new Func <bool>(() => {
                if (beerCaseFSM.Fsm.LastTransition.EventName == "MP_Remove bottle")
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }));

            // Sync beer case bottle count with host.
            if (Network.NetManager.Instance.IsOnline &&
                !Network.NetManager.Instance.IsHost)
            {
                osc.RequestObjectSync();
            }
        }
示例#5
0
        /// <summary>
        /// 派发事件
        /// </summary>
        /// <param name="EvtType">事件类型枚举</param>
        /// <param name="EvtSender">发送者身份标识,不想让接收事件方知道就用 -1</param>
        /// <param name="EvtParam">事件消息内容</param>
        public static void DispatchEvent(string EvtType, int EvtSender, object EvtParam)
        {
            CheckValid();
            if (m_EventHook.ContainsKey(EvtType))
            {
                List <EventHook> l = m_EventHook[EvtType];
                if (l == null || l.Count == 0)
                {
                    return;
                }

                for (int i = l.Count - 1; i >= 0; i--)
                {
                    EventHook f = l[i];
                    if (f != null)
                    {
                        f(EvtSender, EvtParam);
                    }
                }
            }
        }
示例#6
0
 public static void DoEvent(NDEventType evt,
                            int SceneID,
                            object Param)
 {
     CheckValid();
     if (m_EventHook.ContainsKey(evt))
     {
         List <EventHook> l = m_EventHook[evt];
         if (l == null || l.Count == 0)
         {
             return;
         }
         //foreach(EventHook f in l)
         for (int i = 0; i < l.Count; i++)
         {
             EventHook f = l[i];
             if (f != null)
             {
                 f(SceneID, Param);
             }
         }
     }
 }
示例#7
0
        /// <summary>
        /// Hook player trigger events.
        /// </summary>
        /// <param name="fsm">Player trigger FSM on vehicle drivers seat.</param>
        void PlayerEventHooks(PlayMakerFSM fsm)
        {
            // Temp - use player trigger. (No idea what this comment meant, it's now many
            // months later. :P) It's now 6+ months later, no idea what this means at all
            // now. :p -Curtis
            EventHook.Add(fsm, "Player in car", new Func <bool>(() => {
                if (CurrentDrivingState == DrivingStates.Driver && !DriverIsLocal)
                {
                    return(true);
                }
                else
                {
                    CurrentDrivingState = DrivingStates.Driver;
                    DriverIsLocal       = true;
                    SetRemoteSteering(false);
                    Network.NetLocalPlayer.Instance.EnterVehicle(syncComponent, false);
                    return(false);
                }
            }));
            EventHook.Add(fsm, "Wait for player", new Func <bool>(() => {
                if (CurrentDrivingState == DrivingStates.Driver && DriverIsLocal)
                {
                    CurrentDrivingState = DrivingStates.None;
                    DriverIsLocal       = false;
                    Network.NetLocalPlayer.Instance.LeaveVehicle();
                }
                return(false);
            }));
            SeatTransform = fsm.gameObject.transform;

            if (SeatTransform.gameObject.name == "DriveTrigger" &&
                !ParentGameObject.name.StartsWith("JONNEZ") &&
                !ParentGameObject.name.StartsWith("KEKMET"))
            {
                AddPassengerSeat(fsm);
            }
        }
示例#8
0
        /// <summary>
        /// Hook events related to the boat.
        /// </summary>
        void HookEvents()
        {
            // J A N K - Yes, it's called that.
            EventHook.AddWithSync(jankFSM, "State 1");
            EventHook.AddWithSync(jankFSM, "Fail");
            EventHook.AddWithSync(jankFSM, "Start");

            // Ignition
            EventHook.AddWithSync(ignitionFSM, "State 1");

            // Shut Off
            EventHook.AddWithSync(shutOffFSM, "Shut Off");

            // Gears
            EventHook.AddWithSync(gearFSM, "First");
            EventHook.AddWithSync(gearFSM, "Neutral");
            EventHook.AddWithSync(gearFSM, "Reverse");

            // Enter as driver
            EventHook.Add(driveFSM, "Player in car", new Func <bool>(() => {
                gameObject.GetComponent <Components.ObjectSyncComponent>().TakeSyncControl();
                return(false);
            }));
        }
示例#9
0
        /// <summary>
        /// Register world related network message handlers.
        /// </summary>
        /// <param name="netMessageHandler">The network message handler to register
        /// messages to.</param>
        void RegisterNetworkMessagesHandlers(NetMessageHandler netMessageHandler)
        {
            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender,
                 Messages.PickupableSetPositionMessage msg) => {
                Client.Assert(ObjectSyncManager.Instance.ObjectIDs.ContainsKey(msg.id),
                              $"Tried to move pickupable that is not spawned {msg.id}.");
                GameObject gameObject =
                    ObjectSyncManager.Instance.ObjectIDs[msg.id].gameObject;
                gameObject.transform.position = Utils.NetVec3ToGame(msg.position);
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.PickupableActivateMessage msg) => {
                GameObject gameObject = null;
                if (ObjectSyncManager.Instance.ObjectIDs.ContainsKey(msg.id))
                {
                    gameObject = ObjectSyncManager.Instance.ObjectIDs[msg.id].gameObject;
                }
                Client.Assert(gameObject != null,
                              "Tried to activate pickupable but its not spawned!");

                if (msg.activate)
                {
                    gameObject.SetActive(true);
                }
                else
                {
                    if (gameObject != null)
                    {
                        gameObject.SetActive(false);
                    }
                }
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.PickupableSpawnMessage msg) => {
                SpawnPickupable(msg);
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.PickupableDestroyMessage msg) => {
                if (!ObjectSyncManager.Instance.ObjectIDs.ContainsKey(msg.id))
                {
                    return;
                }

                GameObject go;
                try {
                    go = ObjectSyncManager.Instance.ObjectIDs[msg.id].gameObject;
                } catch {
                    Logger.Error(
                        "Failed to remove object: OSC found but can't get GameObject.");
                    return;
                }

                GameObject.Destroy(
                    ObjectSyncManager.Instance.ObjectIDs[msg.id].gameObject);
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender,
                 Messages.WorldPeriodicalUpdateMessage msg) => {
                // Game reports 'next hour' - we want to have transition so correct it.
                GameWorld.Instance.WorldTime = (float)msg.sunClock - 2.0f;
                GameWorld.Instance.WorldDay  = (int)msg.worldDay;
                GameWeatherManager.Instance.SetWeather(msg.currentWeather);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.PlayerSyncMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Log(
                        $"Received synchronization packet from {sender} but there is not player registered using this id.");
                    return;
                }

                player.HandleSynchronize(msg);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.AnimSyncMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Log(
                        $"Received animation synchronization packet from {sender} but there is not player registered using this id.");
                    return;
                }

                player.HandleAnimSynchronize(msg);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.OpenDoorsMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Log(
                        $"Received OpenDoorsMessage however there is no matching player {sender}! (open: {msg.open}");
                    return;
                }

                GameDoor doors = GameDoorsManager.Instance.FindGameDoors(
                    Utils.NetVec3ToGame(msg.position));
                if (doors == null)
                {
                    Logger.Log(
                        $"Player tried to open door, however, the door could not be found!");
                    return;
                }
                doors.Open(msg.open);
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.FullWorldSyncMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);

                // This one should never happen - if happens there is something done
                // miserably wrong.
                Client.Assert(player != null,
                              $"There is no player matching given steam id {sender}.");

                // Handle full world state synchronization.

                HandleFullWorldSync(msg);

                // Spawn host character.

                player.Spawn();

                // Set player state.

                player.Teleport(Utils.NetVec3ToGame(msg.spawnPosition),
                                Utils.NetQuatToGame(msg.spawnRotation));

                if (msg.pickedUpObject != NetPickupable.INVALID_ID)
                {
                    player.PickupObject(msg.pickedUpObject);
                }

                // World is loaded! Notify network manager about that.

                netManager.OnNetworkWorldLoaded();
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.AskForWorldStateMessage msg) => {
                var msgF = new Messages.FullWorldSyncMessage();
                WriteFullWorldSync(msgF);
                netManager.BroadcastMessage(
                    msgF, Steamworks.EP2PSend.k_EP2PSendReliable);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.VehicleEnterMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error(
                        $"Steam user of id {sender} send message however there is no active player matching this id.");
                    return;
                }

                ObjectSyncComponent vehicle =
                    ObjectSyncManager.Instance.ObjectIDs[msg.objectID];
                if (vehicle == null)
                {
                    Logger.Error("Player " + player.SteamId +
                                 " tried to enter vehicle with Object ID " + msg.objectID +
                                 " but there is no vehicle with such id.");
                    return;
                }

                player.EnterVehicle(vehicle, msg.passenger);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.VehicleLeaveMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error(
                        $"Steam user of id {sender} send message however there is no active player matching this id.");
                    return;
                }
                player.LeaveVehicle();
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.VehicleStateMessage msg) => {
                float startTime = -1;

                ObjectSyncComponent vehicle =
                    ObjectSyncManager.Instance.ObjectIDs[msg.objectID];
                if (vehicle == null)
                {
                    Logger.Log("Remote player tried to set state of vehicle " +
                               msg.objectID + " but there is no vehicle with such id.");
                    return;
                }

                if (msg.HasStartTime)
                {
                    startTime = msg.StartTime;
                }

                PlayerVehicle subType = vehicle.GetObjectSubtype() as PlayerVehicle;
                subType.SetEngineState((PlayerVehicle.EngineStates)msg.state,
                                       (PlayerVehicle.DashboardStates)msg.dashstate, startTime);
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.VehicleSwitchMessage msg) => {
                float newValueFloat = -1;

                PlayerVehicle vehicle =
                    ObjectSyncManager.Instance.ObjectIDs[msg.objectID].GetObjectSubtype()
                    as PlayerVehicle;
                if (vehicle == null)
                {
                    Logger.Log("Remote player tried to change a switch in vehicle " +
                               msg.objectID + " but there is no vehicle with such id.");
                    return;
                }

                if (msg.HasSwitchValueFloat)
                {
                    newValueFloat = msg.SwitchValueFloat;
                }

                vehicle.SetVehicleSwitch((PlayerVehicle.SwitchIDs)msg.switchID,
                                         msg.switchValue, newValueFloat);
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.LightSwitchMessage msg) => {
                LightSwitch light = Game.LightSwitchManager.Instance.FindLightSwitch(
                    Utils.NetVec3ToGame(msg.pos));
                light.TurnOn(msg.toggle);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.ObjectSyncMessage msg) => {
                ObjectSyncComponent osc;
                ObjectSyncManager.SyncTypes type = (ObjectSyncManager.SyncTypes)msg.SyncType;
                try {
                    osc = ObjectSyncManager.Instance.ObjectIDs[msg.objectID];
                } catch {
                    Logger.Log(
                        $"Specified object is not yet added to the ObjectID's Dictionary! (Object ID: {msg.objectID})");
                    return;
                }
                if (osc != null)
                {
                    // Set owner.
                    if (type == ObjectSyncManager.SyncTypes.SetOwner)
                    {
                        if (osc.Owner == ObjectSyncManager.NO_OWNER ||
                            osc.Owner == sender.m_SteamID)
                        {
                            osc.OwnerSetToRemote(sender.m_SteamID);
                            netManager.GetLocalPlayer().SendObjectSyncResponse(osc.ObjectID, true);
                        }
                        else
                        {
                            Logger.Debug(
                                $"Set owner request rejected for object: {osc.transform.name} (Owner: {osc.Owner} Sender: {sender.m_SteamID})");
                        }
                    }
                    // Remove owner.
                    else if (type == ObjectSyncManager.SyncTypes.RemoveOwner)
                    {
                        if (osc.Owner == sender.m_SteamID)
                        {
                            osc.OwnerRemoved();
                        }
                    }
                    // Force set owner.
                    else if (type == ObjectSyncManager.SyncTypes.ForceSetOwner)
                    {
                        osc.Owner = sender.m_SteamID;
                        netManager.GetLocalPlayer().SendObjectSyncResponse(osc.ObjectID, true);
                        osc.SyncTakenByForce();
                        osc.SyncEnabled = false;
                    }

                    // Set object's position and variables
                    if (osc.Owner == sender.m_SteamID ||
                        type == ObjectSyncManager.SyncTypes.PeriodicSync)
                    {
                        if (msg.HasSyncedVariables == true)
                        {
                            osc.HandleSyncedVariables(msg.SyncedVariables);
                        }
                        osc.SetPositionAndRotation(Utils.NetVec3ToGame(msg.position),
                                                   Utils.NetQuatToGame(msg.rotation));
                    }
                }
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.ObjectSyncResponseMessage msg) => {
                ObjectSyncComponent osc =
                    ObjectSyncManager.Instance.ObjectIDs[msg.objectID];
                if (msg.accepted)
                {
                    osc.SyncEnabled = true;
                    osc.Owner       = Steamworks.SteamUser.GetSteamID().m_SteamID;
                }
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender,
                                                  Messages.ObjectSyncRequestMessage
                                                  msg) => {
                try {
                    ObjectSyncComponent osc =
                        ObjectSyncManager.Instance.ObjectIDs[msg.objectID];
                    osc.SendObjectSync(ObjectSyncManager.SyncTypes.GenericSync, true, true);
                } catch {
                    Logger.Error(
                        $"Remote client tried to request object sync of an unknown object, Object ID: {msg.objectID}");
                }
            });

            netMessageHandler.BindMessageHandler(
                (Steamworks.CSteamID sender, Messages.EventHookSyncMessage msg) => {
                if (msg.request)
                {
                    EventHook.SendSync(msg.fsmID);
                }
                else
                {
                    if (msg.HasFsmEventName)
                    {
                        EventHook.HandleEventSync(
                            msg.fsmID, msg.fsmEventID, msg.FsmEventName);
                    }
                    else
                    {
                        EventHook.HandleEventSync(msg.fsmID, msg.fsmEventID);
                    }
                }
            });
        }
示例#10
0
        /// <summary>
        /// Hook events for pub food.
        /// </summary>
        void HookEvents()
        {
            PlayMakerFSM foodFSM = Utils.GetPlaymakerScriptByName(FoodGO, "Use");

            EventHook.AddWithSync(foodFSM, "State 2");
        }
示例#11
0
 public MonoMgr()
 {
     hookobj = GameObject.Find(EngineMacro.ENGINE_HOOK).GetComponent <EventHook>();
 }
示例#12
0
        // Event hooks
        public void EventHooks()
        {
            // Generic vehicle FSMs.
            throttleFsm = Utils.GetPlaymakerScriptByName(parentGameObject, "Throttle");
            EventHook.SyncAllEvents(throttleFsm, new Func <bool>(() => {
                if (syncComponent.Owner != steamID && syncComponent.Owner != 0 || syncComponent.Owner == 0 && !Network.NetManager.Instance.IsHost)
                {
                    return(true);
                }
                return(false);
            }));

            // Traffic FSMs.
            EventHook.AddWithSync(directionFsm, "CW", new Func <bool>(() => {
                isClockwise = 1;
                return(false);
            }));
            EventHook.AddWithSync(directionFsm, "CCW", new Func <bool>(() => {
                isClockwise = 0;
                return(false);
            }));

            // Bus specific FSMs.
            if (type == VehicleTypes.Bus)
            {
                PlayMakerFSM doorFsm  = Utils.GetPlaymakerScriptByName(parentGameObject.transform.FindChild("Route").gameObject, "Door");
                PlayMakerFSM startFsm = Utils.GetPlaymakerScriptByName(parentGameObject.transform.FindChild("Route").gameObject, "Start");

                EventHook.SyncAllEvents(doorFsm, new Func <bool>(() => {
                    if (syncComponent.Owner != steamID && syncComponent.Owner != 0 || syncComponent.Owner == 0 && !Network.NetManager.Instance.IsHost)
                    {
                        return(true);
                    }
                    return(false);
                }));

                EventHook.SyncAllEvents(startFsm, new Func <bool>(() => {
                    if (syncComponent.Owner != steamID && syncComponent.Owner != 0 || syncComponent.Owner == 0 && !Network.NetManager.Instance.IsHost)
                    {
                        return(true);
                    }
                    return(false);
                }));
            }

            // None traffic cars specific FSMs.
            if (type == VehicleTypes.Amis || type == VehicleTypes.Fitan)
            {
                PlayMakerFSM crashFsm = Utils.GetPlaymakerScriptByName(parentGameObject.transform.FindChild("CrashEvent").gameObject, "Crash");

                EventHook.SyncAllEvents(crashFsm, new Func <bool>(() => {
                    if (syncComponent.Owner != steamID && syncComponent.Owner != 0 || syncComponent.Owner == 0 && !Network.NetManager.Instance.IsHost)
                    {
                        return(true);
                    }
                    return(false);
                }));
            }

            // Sync vehicle data with the host on spawn.
            if (Network.NetManager.Instance.IsOnline && !Network.NetManager.Instance.IsHost)
            {
                syncComponent.RequestObjectSync();
            }
        }
示例#13
0
 public void SetEventHook(EventHook hook)
 {
     eventHook = hook;
 }
示例#14
0
        private static Task SendHooks(string accountId, List <AccountTask> accountTaskList)
        {
            return(Task.Run(async() =>
            {
                Console.WriteLine(String.Format("{0}: Поток {1} запустился", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));
                var contextOptions = new DbContextOptionsBuilder <WebHooksContext>()
                                     .UseSqlServer("")
                                     .Options;

                ApiClient apiClient = new ApiClient();

                List <EventHook> eventHooks = new List <EventHook>();
                EventHook hook = new EventHook();
                while (true)
                {
                    using (var context = new WebHooksContext(contextOptions))
                    {
                        context.Database.SetCommandTimeout(30);
                        IRepository <EventHook> eventHookRepository = new GenericRepository <EventHook>(context);
                        //IRepository<HookTry> hookTryRepository = new GenericRepository<HookTry>(context);

                        try
                        {
                            eventHooks = await eventHookRepository
                                         .GetQuery(e => e.Subscription)
                                         .AsNoTracking()
                                         .Where(e => e.IsActual && e.Subscription.ExternalAccountId == accountId && e.Subscription.IsActual && e.SendTime <= DateTime.UtcNow && e.SendTime != null)
                                         .OrderBy(e => e.SendTime)
                                         .Take(50)
                                         .ToListAsync();

                            Console.WriteLine(String.Format("{0}: Поток {1} получил записи из базы данных", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));
                        }

                        catch (Exception ex)
                        {
                            Console.WriteLine(String.Format("{0}: Ошибка! {1}", DateTime.Now.ToString("T"), ex));
                            lock (accountTaskList)
                            {
                                accountTaskList.Remove(accountTaskList.Where(a => a.ExternalAccountId == accountId).FirstOrDefault());
                                Console.WriteLine(String.Format("{0}: В Потоке {1} удалена задача", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));
                            }
                            return;
                        }
                    }

                    if (eventHooks.Count == 0)
                    {
                        Console.WriteLine(String.Format("{0}: В Потоке {1} нет записей, пытаемся удалить задачу", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));

                        lock (accountTaskList)
                        {
                            accountTaskList.Remove(accountTaskList.Where(a => a.ExternalAccountId == accountId).FirstOrDefault());
                            Console.WriteLine(String.Format("{0}: В Потоке {1} удалена задача", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));
                        }
                        return;
                    }

                    using (var context = new WebHooksContext(contextOptions))
                    {
                        context.Database.SetCommandTimeout(30);
                        IRepository <EventHook> eventHookRepository = new GenericRepository <EventHook>(context);

                        List <HookTry> hookTryes = new List <HookTry>();

                        for (int i = 0; i < eventHooks.Count(); i++)
                        {
                            HookTry hookTry = new HookTry();

                            hook = eventHooks[i];
                            hookTry.EventHookId = hook.Id;
                            hookTry.CreateTime = DateTime.UtcNow;
                            hookTry.IsActual = true;

                            HttpResponseMessage response = new HttpResponseMessage();
                            try
                            {
                                response = await apiClient.SendRequest(hook.Subscription.Url, hook.Subscription.HttpMethod, hook.Subscription.SecretKey, hook.Subscription.ContentType, hook.Event);
                                if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created && response.StatusCode != HttpStatusCode.NoContent)
                                {
                                    hook.TryCount += 1;

                                    if (hook.TryCount >= 3)
                                    {
                                        hook.Status = "FAILURE";
                                        hook.SendTime = null;
                                    }
                                    else
                                    {
                                        hook.Status = "REPEAT";
                                        if (hook.SendTime != null)
                                        {
                                            hook.SendTime = DateTime.UtcNow.AddMinutes(5.0);
                                        }
                                    }
                                }
                                else
                                {
                                    hook.TryCount += 1;
                                    hook.SendTime = null;
                                    hook.Status = "DONE";
                                }

                                hookTry.Request = String.Format("Method: {0} {1}\nContent-Type: {2}\nParams: {3}", hook.Subscription.HttpMethod, hook.Subscription.Url, hook.Subscription.ContentType, hook.Event);
                                hookTry.Response = apiClient.GetResponseContent(response);
                                hookTry.HttpStatus = ((int)response.StatusCode).ToString();
                                hookTryes.Add(hookTry);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(String.Format("{0}: Ошибка! {1}", DateTime.Now.ToString("T"), ex));
                                continue;
                            }
                            finally
                            {
                                response.Dispose();
                            }

                            try
                            {
                                eventHookRepository.ExecuteQuery("UPDATE EventHooks set Status = {0}, TryCount = {1}, SendTime = {3} where Id = {2}", hook.Status, hook.TryCount, hook.Id, hook.SendTime);
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine(String.Format("{0}: Ошибка! {1}", DateTime.Now.ToString("T"), ex));
                                context.Dispose();
                                lock (accountTaskList)
                                {
                                    accountTaskList.Remove(accountTaskList.Where(a => a.ExternalAccountId == accountId).FirstOrDefault());
                                    Console.WriteLine(String.Format("{0}: В Потоке {1} удалена задача", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));
                                }
                                return;
                            }
                        }
                        try
                        {
                            context.ChangeTracker.AutoDetectChangesEnabled = false;
                            context.HookTryes.AddRange(hookTryes.ToArray());
                            await context.SaveChangesAsync();
                            context.ChangeTracker.AutoDetectChangesEnabled = true;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(String.Format("{0}: Ошибка! {1}", DateTime.Now.ToString("T"), ex));
                            context.Dispose();
                            lock (accountTaskList)
                            {
                                accountTaskList.Remove(accountTaskList.Where(a => a.ExternalAccountId == accountId).FirstOrDefault());
                                Console.WriteLine(String.Format("{0}: В Потоке {1} удалена задача", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId));
                            }
                            return;
                        }
                        Console.WriteLine(String.Format("{0}: Поток {1} обновил {2} записей", DateTime.Now.ToString("T"), Thread.CurrentThread.ManagedThreadId, eventHooks.Count()));
                    }
                }
            }));
        }
示例#15
0
 /**
  * Removes a hook for when a game event is fired.
  *
  * @param name          Name of event.
  * @param callback      An EventHook function pointer.
  * @param mode          Optional EventHookMode determining the type of hook.
  * @error               Invalid callback function or no active hook for specified event.
  */
 public static void UnhookEvent(string name, EventHook callback, EventHookMode mode = EventHookMode.EventHookMode_Post)
 {
     throw new NotImplementedException();
 }
示例#16
0
        /// <summary>
        /// Register world related network message handlers.
        /// </summary>
        /// <param name="netMessageHandler">The network message handler to register messages to.</param>
        void RegisterNetworkMessagesHandlers(NetMessageHandler netMessageHandler)
        {
            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.PickupableSetPositionMessage msg) => {
                Client.Assert(ObjectSyncManager.GetObjectByID(msg.id), $"Tried to move pickupable that is not spawned {msg.id}.");
                GameObject gameObject         = ObjectSyncManager.GetObjectByID(msg.id);
                gameObject.transform.position = Utils.NetVec3ToGame(msg.position);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.PickupableActivateMessage msg) => {
                GameObject gameObject = null;
                if (ObjectSyncManager.GetObjectByID(msg.id))
                {
                    gameObject = ObjectSyncManager.GetObjectByID(msg.id);
                }
                Client.Assert(gameObject != null, "Tried to activate a pickupable but it's not spawned! Does any connected client or you have other mods beside MSC:MP installed? Try uninstalling them!");

                if (msg.activate)
                {
                    gameObject.SetActive(true);
                }
                else
                {
                    if (gameObject != null)
                    {
                        gameObject.SetActive(false);
                    }
                }
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.PickupableSpawnMessage msg) => {
                SpawnPickupable(msg);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.PickupableDestroyMessage msg) => {
                if (!ObjectSyncManager.GetSyncComponentByID(msg.id))
                {
                    return;
                }

                ObjectSyncComponent osc = ObjectSyncManager.GetSyncComponentByID(msg.id);

                GameObject.Destroy(ObjectSyncManager.GetObjectByID(msg.id));
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.WorldPeriodicalUpdateMessage msg) => {
                // Game reports 'next hour' - we want to have transition so correct it.
                GameWorld.Instance.WorldTime = (float)msg.sunClock - 2.0f;
                GameWorld.Instance.WorldDay  = (int)msg.worldDay;
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.PlayerSyncMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error($"Received synchronization packet from {sender} but there is not player registered using this id.");
                    return;
                }

                player.HandleSynchronize(msg);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.AnimSyncMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error($"Received animation synchronization packet from {sender} but there is not player registered using this id.");
                    return;
                }

                player.HandleAnimSynchronize(msg);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.OpenDoorsMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error($"Received OpenDoorsMessage however there is no matching player {sender}! (open: {msg.open}");
                    return;
                }

                GameDoor doors = GameDoorsManager.Instance.FindGameDoors(Utils.NetVec3ToGame(msg.position));
                if (doors == null)
                {
                    Logger.Error($"Player tried to open door, however, the door could not be found!");
                    return;
                }
                doors.Open(msg.open);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.FullWorldSyncMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);

                // This one should never happen - if happens there is something done miserably wrong.
                Client.Assert(player != null, $"There is no player matching given steam id {sender}.");

                // Handle full world state synchronization.

                HandleFullWorldSync(msg);

                // Spawn host character.

                player.Spawn();

                // Set player state.

                player.Teleport(Utils.NetVec3ToGame(msg.spawnPosition), Utils.NetQuatToGame(msg.spawnRotation));

                if (msg.pickedUpObject != NetPickupable.INVALID_ID)
                {
                    player.PickupObject(msg.pickedUpObject);
                }

                // World is loaded! Notify network manager about that.

                netManager.OnNetworkWorldLoaded();
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.AskForWorldStateMessage msg) => {
                var msgF = new Messages.FullWorldSyncMessage();
                WriteFullWorldSync(msgF);
                netManager.SendMessage(netManager.GetPlayer(sender), msgF, Steamworks.EP2PSend.k_EP2PSendReliable);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.VehicleEnterMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error($"Steam user of id {sender} send message however there is no active player matching this id.");
                    return;
                }

                ObjectSyncComponent vehicle = ObjectSyncManager.Instance.ObjectIDs[msg.objectID];
                if (vehicle == null)
                {
                    Logger.Error("Player " + player.SteamId + " tried to enter vehicle with Object ID " + msg.objectID + " but there is no vehicle with such id.");
                    return;
                }

                player.EnterVehicle(vehicle, msg.passenger);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.VehicleLeaveMessage msg) => {
                NetPlayer player = netManager.GetPlayer(sender);
                if (player == null)
                {
                    Logger.Error($"Steam user of id {sender} send message however there is no active player matching this id.");
                    return;
                }
                player.LeaveVehicle();
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.VehicleSwitchMessage msg) => {
                float newValueFloat = -1;

                PlayerVehicle vehicle = ObjectSyncManager.Instance.ObjectIDs[msg.objectID].GetObjectSubtype() as PlayerVehicle;
                if (vehicle == null)
                {
                    Logger.Debug("Remote player tried to change a switch in vehicle " + msg.objectID + " but there is no vehicle with such id.");
                    return;
                }

                if (msg.HasSwitchValueFloat)
                {
                    newValueFloat = msg.SwitchValueFloat;
                }

                vehicle.SetVehicleSwitch((PlayerVehicle.SwitchIDs)msg.switchID, msg.switchValue, newValueFloat);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.LightSwitchMessage msg) => {
                LightSwitch light = LightSwitchManager.Instance.FindLightSwitch(Utils.NetVec3ToGame(msg.pos));
                light.TurnOn(msg.toggle);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.ObjectSyncMessage msg) => {
                ObjectSyncComponent osc;
                ObjectSyncManager.SyncTypes type = (ObjectSyncManager.SyncTypes)msg.SyncType;
                if (ObjectSyncManager.GetObjectByID(msg.objectID))
                {
                    osc = ObjectSyncManager.GetSyncComponentByID(msg.objectID);
                }
                else
                {
                    Logger.Error($"Specified object is not yet added to the ObjectID's Dictionary! (Object ID: {msg.objectID})");
                    return;
                }

                // This *should* never happen, but apparently it's possible.
                Client.Assert(osc != null, $"Object Sync Component wasn't found for object with ID {msg.objectID}, however, the object had a dictionary entry!");

                // Host controls who owns an object.
                if (NetManager.Instance.IsHost)
                {
                    // Set owner on host.
                    if (type == ObjectSyncManager.SyncTypes.SetOwner)
                    {
                        ObjectSyncManager.SetOwnerHandler(msg, osc, sender);
                    }
                    // Remove owner on host.
                    if (type == ObjectSyncManager.SyncTypes.RemoveOwner)
                    {
                        if (osc.Owner == netManager.GetLocalPlayer())
                        {
                            ObjectSyncManager.RemoveOwnerHandler(msg, osc, sender);
                        }
                    }
                    // Sync taken by force on host.
                    if (type == ObjectSyncManager.SyncTypes.ForceSetOwner)
                    {
                        ObjectSyncManager.SyncTakenByForceHandler(msg, osc, sender);
                    }
                }

                // Set ownership info on clients.
                else
                {
                    NetPlayer player = netManager.GetPlayerByPlayerID(msg.OwnerPlayerID);
                    // Check if player exists.
                    if (player == null)
                    {
                        return;
                    }
                    // Set owner.
                    if (type == ObjectSyncManager.SyncTypes.SetOwner)
                    {
                        if (osc.Owner != netManager.GetLocalPlayer())
                        {
                            osc.OwnerSetToRemote(player);
                        }
                        osc.Owner = player;
                    }
                    // Remove owner.
                    else if (type == ObjectSyncManager.SyncTypes.RemoveOwner)
                    {
                        if (osc.Owner != netManager.GetLocalPlayer())
                        {
                            osc.OwnerRemoved();
                        }
                        osc.Owner = null;
                    }
                    // Force set owner.
                    else if (type == ObjectSyncManager.SyncTypes.ForceSetOwner)
                    {
                        if (osc.Owner != netManager.GetLocalPlayer())
                        {
                            osc.SyncTakenByForce();
                            osc.SyncEnabled = false;
                        }
                        osc.Owner = player;
                        if (osc.Owner == netManager.GetLocalPlayer())
                        {
                            osc.SyncEnabled = true;
                        }
                    }
                }

                // Set object's position and variables.
                if ((osc.Owner == netManager.GetPlayer(sender)) || type == ObjectSyncManager.SyncTypes.PeriodicSync)
                {
                    // Send synced variables, or variables only sync in some cases.
                    if (msg.HasSyncedVariables)
                    {
                        osc.HandleSyncedVariables(msg.SyncedVariables);
                    }

                    // Full sync.
                    if (msg.HasPosition && msg.HasRotation)
                    {
                        osc.SetPositionAndRotation(Utils.NetVec3ToGame(msg.Position), Utils.NetQuatToGame(msg.Rotation));
                    }
                    // Position only sync.
                    else if (msg.HasPosition)
                    {
                        Quaternion zero = new Quaternion(0, 0, 0, 0);
                        osc.SetPositionAndRotation(Utils.NetVec3ToGame(msg.Position), zero);
                    }
                    // Rotation only sync.
                    else if (msg.HasRotation)
                    {
                        osc.SetPositionAndRotation(Vector3.zero, Utils.NetQuatToGame(msg.Rotation));
                    }
                }
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.ObjectSyncResponseMessage msg) => {
                ObjectSyncComponent osc = ObjectSyncManager.GetSyncComponentByID(msg.objectID);
                if (msg.accepted)
                {
                    osc.SyncEnabled = true;
                    osc.Owner       = NetManager.Instance.GetLocalPlayer();
                }
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.ObjectSyncRequestMessage msg) => {
                Client.Assert(ObjectSyncManager.GetObjectByID(msg.objectID), $"Remote client tried to request object sync of an unknown object, remote ObjectID was: {msg.objectID}");

                ObjectSyncComponent osc = ObjectSyncManager.GetSyncComponentByID(msg.objectID);
                osc.SendObjectSync(ObjectSyncManager.SyncTypes.GenericSync, true, true);
            });

            netMessageHandler.BindMessageHandler((Steamworks.CSteamID sender, Messages.EventHookSyncMessage msg) => {
                if (msg.request)
                {
                    EventHook.SendSync(msg.fsmID);
                    return;
                }

                if (msg.HasFsmEventName)
                {
                    EventHook.HandleEventSync(msg.fsmID, msg.fsmEventID, msg.FsmEventName);
                }
                else
                {
                    EventHook.HandleEventSync(msg.fsmID, msg.fsmEventID);
                }
            });
        }
示例#17
0
 public bool Equals(EventHook other)
 {
     return(name == other.name && Equals(target, other.target) && Equals(tag, other.tag));
 }
示例#18
0
        /// <summary>
        /// Hook vehicle events.
        /// </summary>
        void HookEvents()
        {
            // Engine states
            string[] ignitionStateNames = { "Wait button", "Motor starting", "Motor OFF", "Test", "Shut off", "ACC on", "ACC on 2" };

            foreach (string name in ignitionStateNames)
            {
                EventHook.AddWithSync(ignitionFsm, name);
            }


            // Dashboard states
            string[] dashboardStateNames = { "ACC on", "Test", "ACC on 2", "Motor starting", "Shut off", "Motor OFF", "Wait button", "Wait player" };

            foreach (string name in dashboardStateNames)
            {
                EventHook.Add(dashboardFsm, name, new Func <bool>(() => {
                    return(false);
                }));
            }

            // Vehicle switches

            // Range
            if (hasRange)
            {
                if (isTruck)
                {
                    EventHook.AddWithSync(rangeFsm, "Switch");
                }
                else if (isTractor)
                {
                    EventHook.AddWithSync(rangeFsm, "Flip");
                }
            }

            // Push parking brake
            if (hasPushParkingBrake)
            {
                EventHook.Add(handbrakeFsm, "DECREASE", new Func <bool>(() => {
                    Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.HandbrakePull, false, this.handbrakeFsm.Fsm.GetFsmFloat("KnobPos").Value);
                    return(false);
                }), actionOnExit: true);
                EventHook.Add(handbrakeFsm, "INCREASE", new Func <bool>(() => {
                    Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.HandbrakePull, false, this.handbrakeFsm.Fsm.GetFsmFloat("KnobPos").Value);
                    return(false);
                }), actionOnExit: true);
            }

            // Truck parking brake
            if (hasLeverParkingBrake)
            {
                EventHook.Add(handbrakeFsm, "Flip", new Func <bool>(() => {
                    Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.HandbrakeLever, !this.handbrakeFsm.Fsm.GetFsmBool("Brake").Value, -1);
                    return(false);
                }));
            }

            // Fuel tap
            if (fuelTapFsm != null)
            {
                EventHook.Add(fuelTapFsm, "Test", new Func <bool>(() => {
                    Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.FuelTap, !this.fuelTapFsm.Fsm.GetFsmBool("FuelOn").Value, -1);
                    return(false);
                }));
            }

            // Lights
            if (lightsFsm != null)
            {
                EventHook.AddWithSync(lightsFsm, "Off");
                EventHook.AddWithSync(lightsFsm, "Shorts");
                EventHook.AddWithSync(lightsFsm, "Longs");
            }

            // Indicators
            if (indicatorsFsm != null)
            {
                EventHook.AddWithSync(indicatorsFsm, "Activate dash");
                EventHook.AddWithSync(indicatorsFsm, "Activate dash 2");
                EventHook.AddWithSync(indicatorsFsm, "On", action: new Func <bool>(() => {
                    if (this.DriverIsLocal == false)
                    {
                        return(true);
                    }
                    return(false);
                }));
                EventHook.AddWithSync(indicatorsFsm, "On 2", action: new Func <bool>(() => {
                    if (this.DriverIsLocal == false)
                    {
                        return(true);
                    }
                    return(false);
                }));
                EventHook.AddWithSync(indicatorsFsm, "Off", action: new Func <bool>(() => {
                    if (this.DriverIsLocal == false)
                    {
                        return(true);
                    }
                    return(false);
                }));
                EventHook.AddWithSync(indicatorsFsm, "Off 2", action: new Func <bool>(() => {
                    if (this.DriverIsLocal == false)
                    {
                        return(true);
                    }
                    return(false);
                }));

                EventHook.AddWithSync(indicatorsFsm, "State 3", action: new Func <bool>(() => {
                    if (this.DriverIsLocal == false)
                    {
                        Logger.Log("Turning off indicators!");
                        GameObject left;
                        GameObject right;
                        left  = this.gameObject.transform.FindChild("LOD/Electricity/PowerON/Blinkers/Left").gameObject;
                        right = this.gameObject.transform.FindChild("LOD/Electricity/PowerON/Blinkers/Right").gameObject;
                        // Ferndale has a different hierarchy. Why not, right?
                        if (left == null)
                        {
                            left  = this.gameObject.transform.FindChild("LOD/Electricity 1/PowerON/Blinkers/Left").gameObject;
                            right = this.gameObject.transform.FindChild("LOD/Electricity 1/PowerON/Blinkers/Right").gameObject;
                        }
                        left.SetActive(false);
                        right.SetActive(false);
                        if (left == null)
                        {
                            Logger.Log("Left indicator not found!");
                        }
                    }
                    return(false);
                }));
            }

            // Wipers
            if (wipersFsm != null)
            {
                EventHook.Add(wipersFsm, "Test 2", new Func <bool>(() => {
                    int selection = this.wipersFsm.Fsm.GetFsmInt("Selection").Value;
                    if (selection == 2)
                    {
                        selection = 0;
                    }
                    else
                    {
                        selection++;
                    }

                    Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.Wipers, false, selection);
                    return(false);
                }));
            }

            // Interior light
            if (lightsFsm != null)
            {
                if (isTruck)
                {
                    EventHook.Add(interiorLightFsm, "Switch", new Func <bool>(() => {
                        Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.InteriorLight, !this.interiorLightFsm.Fsm.GetFsmBool("On").Value, -1);
                        return(false);
                    }));
                }
                else
                {
                    EventHook.Add(interiorLightFsm, "Flip 2", new Func <bool>(() => {
                        Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.InteriorLight, !this.interiorLightFsm.Fsm.GetFsmBool("LightON").Value, -1);
                        return(false);
                    }));
                }
            }

            // Truck related events
            if (isTruck)
            {
                // Hydraulic pump
                EventHook.Add(hydraulicPumpFsm, "Test", new Func <bool>(() => {
                    if (this.hydraulicPumpFirstRun == false)
                    {
                        Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.HydraulicPump, !this.hydraulicPumpFsm.Fsm.GetFsmBool("On").Value, -1);
                    }
                    else
                    {
                        this.hydraulicPumpFirstRun = false;
                    }
                    return(false);
                }));

                // Spill valve
                EventHook.Add(spillValveFsm, "Switch", new Func <bool>(() => {
                    Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.SpillValve, !this.spillValveFsm.Fsm.GetFsmBool("Open").Value, -1);
                    return(false);
                }));

                // Axle lift
                EventHook.Add(axleLiftFsm, "Test", new Func <bool>(() => {
                    if (this.axleLiftFirstRun == false)
                    {
                        Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.AxleLift, !this.axleLiftFsm.Fsm.GetFsmBool("Up").Value, -1);
                    }
                    else
                    {
                        this.axleLiftFirstRun = false;
                    }
                    return(false);
                }));

                // Diff lock
                EventHook.Add(diffLockFsm, "Test", new Func <bool>(() => {
                    if (this.diffLockFirstRun == false)
                    {
                        Network.NetLocalPlayer.Instance.WriteVehicleSwitchMessage(syncComponent, SwitchIDs.DiffLock, !this.diffLockFsm.Fsm.GetFsmBool("Lock").Value, -1);
                    }
                    else
                    {
                        this.diffLockFirstRun = false;
                    }
                    return(false);
                }));

                // Beacon
                EventHook.AddWithSync(beaconFsm, "ON");
                EventHook.AddWithSync(beaconFsm, "OFF");
            }

            // Wasp nest
            if (waspNestFsm != null)
            {
                EventHook.AddWithSync(waspNestFsm, "State 2");
            }

            // Sync vehicle data with the host on spawn.
            if (Network.NetManager.Instance.IsOnline && !Network.NetManager.Instance.IsHost)
            {
                syncComponent.RequestObjectSync();
            }
        }
示例#19
0
        public IActionResult MensagemEnviada([FromBody] EventHook eventHook)
        {
            var jsonEventHook = JsonConvert.SerializeObject(eventHook);

            _logger.LogInformation($"Acessando POST mensagem-enviada {nameof(ClienteController)} {nameof(eventHook)}: {jsonEventHook}");

            foreach (var conteudo in eventHook.Message.Contents.Where(x => x.Type == "text"))
            {
                var mensagem = new MensagemZAP
                {
                    From            = eventHook.Message.From,
                    Channel         = eventHook.Message.Channel,
                    Direction       = eventHook.Message.Direction,
                    To              = eventHook.Message.To,
                    Conteudo        = conteudo.Text,
                    VisitorFullName = eventHook.Message.Visitor.Name,
                    Data            = DateTime.Now,
                };

                _context.MensagemZAP.Add(mensagem);


                var cliente = _context.Cliente.Where(x => x.Celular == mensagem.From).FirstOrDefault();

                if (cliente == null)
                {
                    cliente         = new Cliente();
                    cliente.Celular = mensagem.From;
                    cliente.Nome    = mensagem.VisitorFullName;

                    _context.Cliente.Add(cliente);
                }

                _context.SaveChanges();

                if (mensagem.Conteudo.ToLower().Contains("oi") && mensagem.Direction == "IN")
                {
                    Autenticacao autenticacao = new Autenticacao();
                    autenticacao.ClienteId = cliente.ClienteId;
                    autenticacao.Data      = DateTime.Now;
                    autenticacao.GerarCodigo();

                    _context.Autenticacao.Add(autenticacao);
                    _context.SaveChanges();

                    var mensagemAutenticacao = $"Digite:{autenticacao.Codigo} para completar a autenticação:";


                    var sender = new SenderMessageRequest();
                    sender.From     = "furry-time";
                    sender.To       = cliente.Celular;
                    sender.Contents = new List <Models.SendMessageZenvia.Content>();
                    sender.Contents.Add(new Models.SendMessageZenvia.Content {
                        Type = "text", Text = mensagemAutenticacao, Payload = string.Empty
                    });


                    var json = JsonConvert.SerializeObject(sender);
                    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, $"https://api.zenvia.com/v1/channels/whatsapp/messages");
                    httpRequestMessage.Headers.Add("X-API-TOKEN", "sxyGdagDRB3AFLl51p_y5gGzXnIyx2w4qmzR");
                    httpRequestMessage.Content = new StringContent(json, Encoding.UTF8, "application/json");

                    var httpClient = new HttpClient();
                    var response   = httpClient.SendAsync(httpRequestMessage).Result;
                }
            }

            return(Ok());
        }