示例#1
0
        // Culled does the real work of walking forward with a pair of pointers
        // yielding only the nodes where a capsule clipped while attempting the direct path
        private IEnumerable <Vector3> Culled(IEnumerable <Vector3> path)
        {
            Vector3[] orig = path.ToArray();
            if (orig.Length < 2)
            {
                foreach (Vector3 step in orig)
                {
                    yield return(step);
                }
            }
            else
            {
                var seenEnts = new HashSet <EntHandle>();
                int i        = 0;
                for (int j = 2; j < orig.Length - 1; j++)
                {
                    if (Raycast(orig[i], orig[j], CapsuleSize, IntersectOptions.Everything ^ IntersectOptions.Vegetation, Self).DidHit)
                    {
                        Log($"Culled() up to {j}");
                        yield return(orig[j - 1]);

                        i = j;
                    }
                    else
                    {
                        // as we move j forward, "light up" the closest ents it passes
                        // once that ent has been activated (added to the seenEnts set),
                        // we will keep checking it for collision as j advances
                        foreach (EntHandle ent in NearbyObjects().OrderBy(DistanceTo(orig[j])).Take(4).Concat(seenEnts))
                        {
                            if (GetEntityType(ent) != EntityType.Invalid)
                            {
                                if (!seenEnts.Contains(ent))
                                {
                                    seenEnts.Add(ent);
                                }
                                ModelHash model = GetModel(ent);
                                Matrix4x4 m     = Matrix(ent);
                                GetModelDimensions(model, out Vector3 backLeft, out Vector3 frontRight);
                                if (IntersectModel(orig[i], orig[j], m, backLeft, frontRight))
                                {
                                    Log($"Culled() up to {j} (using IntersectModel)");
                                    yield return(orig[j - 1]);

                                    i = j;
                                    seenEnts.Clear();
                                    break;
                                }
                            }
                        }
                    }
                }
                // always keep the last two steps untouched, as an anchor
                yield return(orig[orig.Length - 2]);

                yield return(orig[orig.Length - 1]);
            }
        }
示例#2
0
        public static void GetDoorState(ModelHash doorModel, Vector3 pos, out bool locked, out float heading)
        {
            bool  _lock = true;
            float h     = 0f;

            unsafe {
                Call(GET_STATE_OF_CLOSEST_DOOR_OF_TYPE, doorModel, pos, new IntPtr(&_lock), new IntPtr(&h));
            }
            locked  = _lock;
            heading = h;
        }
        public DefaultIncrementalModelTreeTraverseService()
        {
            CurrentModelHash  = new ModelHash();
            IgnoredModelNodes = new List <ModelNode>();

            DefaultDefinitionFullPathSeparator    = "/";
            DefaultDefinitionIdentityKeySeparator = ";";

            DefaultPersistenceModelIdPrefix = "spmeta2.incremental_state";

            EnableCaching = true;
        }
示例#4
0
        public static IEnumerable <ModelBox> GetBlockingEnts(int limit = 30, bool debug = false)
        {
            foreach (EntHandle ent in NearbyObjects().Take(limit))
            {
                if (IsAttached(ent))
                {
                    continue;                     // dont block on items held or carried by peds
                }
                Matrix4x4 m   = Matrix(ent);
                Vector3   pos = Position(m);
                if (pos == Vector3.Zero || DistanceToSelf(pos) > 100f * 100f)
                {
                    continue;
                }

                ModelHash model = GetModel(ent);
                if (checkDoorModels.Contains(model))
                {
                    GetDoorState(model, pos, out bool locked, out float heading);
                    if (!locked)
                    {
                        continue;
                    }
                }
                if (ignoreModels.Contains((long)model))
                {
                    continue;
                }

                GetModelDimensions(model, out Vector3 backLeft, out Vector3 frontRight);
                float volume = GetVolume(frontRight, backLeft);
                if (debug)
                {
                    DrawBox(m, backLeft, frontRight);
                }
                if (debug)
                {
                    UI.DrawTextInWorldWithOffset(pos, 0f, .02f, $"{model} ({volume:F2})");
                }
                if (volume > 170)
                {
                    ignoreModels.Add((long)model);
                }
                else
                {
                    yield return(new ModelBox()
                    {
                        Model = model, Entity = ent, M = m, Front = frontRight, Back = backLeft
                    });
                }
            }
        }
示例#5
0
        public static void GetModelDimensions(ModelHash model, out Vector3 backLeft, out Vector3 frontRight)
        {
            if (modelDimensionCache.TryGetValue(model, out ModelDims dims))
            {
                backLeft   = dims.backLeft;
                frontRight = dims.frontRight;
                return;
            }
            NativeVector3 a, b;

            unsafe { Call(GET_MODEL_DIMENSIONS, model, new IntPtr(&a), new IntPtr(&b)); }
            backLeft   = a;
            frontRight = b;
            modelDimensionCache.TryAdd(model, new ModelDims()
            {
                backLeft = a, frontRight = b
            });
        }
示例#6
0
        public static ProvisionServiceBase SetIncrementalProvisionModelHash(this ProvisionServiceBase service, ModelHash modelHash)
        {
            var typedModelService = GetIncrementalModelTraverseService(service);

            typedModelService.PreviousModelHash = modelHash;

            return(service);
        }
示例#7
0
 public static EntHandle CreateObject(ModelHash model, Vector3 pos, bool dynamic)
 {
     return(RequestModel(model) != AssetStatus.Loaded
                         ? EntHandle.Invalid
                         : Call <EntHandle>(CREATE_OBJECT_NO_OFFSET, model, pos, 1, 1, dynamic));
 }
示例#8
0
 public static bool IsLoaded(ModelHash model) => model == 0 ? false : Call <bool>(HAS_MODEL_LOADED, model);
        public string Register(RegisterMessage register)
        {
            // check length
            if (!string.IsNullOrWhiteSpace(register.Username))
            {
                if (register.Username.Length > 20)
                {
                    throw HttpResponseExceptionHelper.Create("Votre nom d'usager excède 20 caractères",
                                                             HttpStatusCode.BadRequest);
                }
                if (register.Username.Contains(" "))
                {
                    throw HttpResponseExceptionHelper.Create("Votre nom d'usager ne doit pas contenir d'espace",
                                                             HttpStatusCode.BadRequest);
                }
            }
            UserModel newUser;

            //Check if credentials are OK
            if (string.IsNullOrWhiteSpace(register.Username))
            {
                throw HttpResponseExceptionHelper.Create("Aucun nom d'usager spécifier", HttpStatusCode.BadRequest);
            }

            if (!register.Username.All(char.IsLetterOrDigit))
            {
                throw HttpResponseExceptionHelper.Create("Le nom d'usager doit être alpla numérique", HttpStatusCode.BadRequest);
            }

            if (string.IsNullOrWhiteSpace(register.Password) && string.IsNullOrWhiteSpace(register.FacebookId))
            {
                throw HttpResponseExceptionHelper.Create("Le format d'enregistrement est invalide", HttpStatusCode.BadRequest);
            }

            using (var db = new SystemDBContext())
            {
                UserModel user = null;

                // Search facebook user and then username
                if (!string.IsNullOrWhiteSpace(register.FacebookId))
                {
                    user = db.Users.FirstOrDefault(x => x.FacebookId == register.FacebookId);
                }
                if (user != null)
                {
                    throw HttpResponseExceptionHelper.Create("L'usager Facebook existe déjà", HttpStatusCode.BadRequest);
                }

                if (!string.IsNullOrWhiteSpace(register.Username))
                {
                    user = db.Users.FirstOrDefault(x => x.Username == register.Username);
                }
                // User already exist
                if (user != null)
                {
                    throw HttpResponseExceptionHelper.Create("Un usager avec ce nom existe déjà",
                                                             HttpStatusCode.BadRequest);
                }

                // create new user
                newUser = new UserModel()
                {
                    FacebookId       = register.FacebookId,
                    Username         = register.Username,
                    Password         = PasswordHash.CreateHash(register.Password),
                    FacebookPost     = false,
                    PushNotification = false
                };
                newUser.HashId = ModelHash.GetUserHash(newUser);

                var newProfile = ProfileModelHelper.Initialize(new ProfileModel());
                newProfile.UserHashId = newUser.HashId;
                newProfile.Username   = register.Username;


                // ALL MIGHTY POWER
                // HACK FOR FELIX USER
                if (newUser.Username.ToLower().Equals("felix"))
                {
                    newProfile.Experience         = 9000;
                    newProfile.PrincessTitle      = EnumsModel.PrincessTitle.MASTER;
                    newProfile.Description        = "ALL MIGHTY GOD OF THE BACKEND AND BACKLOG";
                    newProfile.Picture            = EnumsModel.PrincessAvatar.Mulan;
                    newProfile.AchievementsString =
                        "{\"AddAvatar\":true,\"FastGamePoints\":true,\"FinishCampain\":true,\"FinishOtherSucess\":true,\"FirstMapCreated\":true,\"FirstOnlineGame\":true,\"FirstOnlineGameWon\":true,\"FirstTimeConnect\":true,\"GamePoints\":true,\"PlayWithAFriend\":true}";
                }

                // Add user
                newUser = CreateUser(newUser);

                // Add profile
                db.Profiles.Add(newProfile);
                db.SaveChanges();
            }

            return(GetToken(newUser));
        }
示例#10
0
 public static bool IsHeli(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_HELI, m);
示例#11
0
 public static bool IsAmphibiousCar(ModelHash m) => Call <bool>((Hash)0x633F6F44A537EBB6, m);
示例#12
0
 public static bool IsCar(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_CAR, m);
示例#13
0
 public static bool IsBoat(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_BOAT, m);
示例#14
0
 public static bool IsMotorbike(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_BIKE, m);
示例#15
0
 public static bool IsBicycle(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_BICYCLE, m);
示例#16
0
 public static AssetStatus RequestModel(ModelHash model) => (!IsValid(model))
                         ? AssetStatus.Invalid
                         : Call <ModelHash>(REQUEST_MODEL, model) == model ? AssetStatus.Loaded : AssetStatus.Loading;
示例#17
0
 /// <summary>
 /// 获取哈希码。
 /// </summary>
 /// <returns>返回 32 位整数。</returns>
 public override int GetHashCode()
 => ModelHash.CompatibleGetHashCode();
示例#18
0
 public static bool IsPlane(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_PLANE, m);
示例#19
0
        protected override void OnBeforeDeployModel(object modelHost, ModelNode modelNode)
        {
            base.OnBeforeDeployModel(modelHost, modelNode);

            // clean up current model hash
            CurrentModelHash = new ModelHash();
            ClearCaches();

            TraceService.InformationFormat(0, "Starting incremental provision with EnableCaching = {0}", EnableCaching);

            var storages = ResolvePersistenceStorages(modelHost, modelNode);

            // restore previous one
            if (Configuration != null && storages.Count() > 0)
            {
                TraceService.Information(0, "Model hash restore: found [{0}] storage impl in Configuration.PersistenceStorages. Automatic model hash management is used");

                var modelIdProperty = modelNode.GetPropertyBagValue(DefaultModelNodePropertyBagValue.Sys.IncrementalProvision.PersistenceStorageModelId);

                if (modelIdProperty == null)
                {
                    throw new SPMeta2Exception("IncrementalProvisionModelId is not set. Either clean PersistenceStorages and handle model hash persistence manually or set .PersistenceStorageModelId");
                }

                var modelId  = modelIdProperty;
                var objectId = string.Format("{0}.{1}", DefaultPersistenceModelIdPrefix, modelId);

                var serializer = ServiceContainer.Instance.GetService <DefaultXMLSerializationService>();
                serializer.RegisterKnownTypes(new[]
                {
                    typeof(ModelHash),
                    typeof(ModelNodeHash)
                });

                foreach (var storage in storages)
                {
                    TraceService.Information(0, string.Format("Restoring model hash with object id:[{0}] using storage impl [{1}]",
                                                              objectId, storage.GetType()));

                    var data = storage.LoadObject(objectId);

                    if (data != null)
                    {
                        var dataString = Encoding.UTF8.GetString(data);
                        var dataObject = serializer.Deserialize(typeof(ModelHash), dataString) as ModelHash;

                        if (dataObject != null)
                        {
                            PreviousModelHash = dataObject;

                            TraceService.Information(0, string.Format("Restored model hash with object id:[{0}] using storage impl [{1}]",
                                                                      objectId, storage.GetType()));
                            break;
                        }
                    }
                    else
                    {
                        TraceService.Information(0, string.Format("Restored model hash with object id:[{0}] using storage impl [{1}]",
                                                                  objectId, storage.GetType()));
                    }
                }

                TraceService.Information(0, string.Format("Coudn't restore model hash with object id:[{0}]. Either first provision is user or storage is wrong.", objectId));
            }
            else
            {
                TraceService.Information(0, "Model hash restore: can't find any persistence storage impl in Configuration.PersistenceStorages. Assuming manual model hash management is used");
            }
        }
示例#20
0
 public static bool IsTrain(ModelHash m) => Call <bool>(IS_THIS_MODEL_A_TRAIN, m);
示例#21
0
文件: Peds.cs 项目: jessegranger/Shiv
        public static PedHandle CreatePedInsideVehicle(VehicleHandle veh, PedType type, ModelHash model, VehicleSeat seat)
        {
            switch (RequestModel(model))
            {
            case AssetStatus.Invalid: return(PedHandle.ModelInvalid);

            case AssetStatus.Loading: return(PedHandle.ModelLoading);

            default: return(Call <PedHandle>(CREATE_PED_INSIDE_VEHICLE, veh, type, model, seat, true, true));
            }
        }
示例#22
0
 public static bool IsVehicle(ModelHash m) => Call <bool>(IS_MODEL_A_VEHICLE, m);
示例#23
0
 public static void NotNeeded(ModelHash m) => Call(SET_MODEL_AS_NO_LONGER_NEEDED, m);
示例#24
0
 public static bool IsValid(ModelHash model) => model == ModelHash.Invalid ? false : Call <bool>(IS_MODEL_VALID, model);