示例#1
0
        private GeoRock GetClosestRock(GeoControl geo)
        {
            //This isn't efficient at all but it's fine because the value is cached in rockChasers
            List <GeoRock> validRocks = rocks.Where(rockPair => !rockChasers.ContainsKey(rockPair.Key)).Select(rockPair => rockPair.Key).ToList();

            if (validRocks.Count == 0)
            {
                return(null);
            }

            GeoRock closest     = validRocks[0];
            float   closestDist = DistBetween(validRocks[0].transform.position, geo.transform.position);

            foreach (GeoRock rock in validRocks)
            {
                float newDist = DistBetween(rock.transform.position, geo.transform.position);
                if (newDist < closestDist)
                {
                    closestDist = newDist;
                    closest     = rock;
                }
            }

            return(closest);
        }
示例#2
0
        private void UnRegisterGeo(On.GeoControl.orig_Disable orig, GeoControl self, float waitTime)
        {
            orig(self, waitTime);

            //If we don't set this explicitly, it will get added back into the tracked geo during FixedUpdate
            geoAttracted.SetValue(self, false);

            if (rockChasersReverseLookup.ContainsKey(self))
            {
                rockChasers.Remove(rockChasersReverseLookup[self]);
                rockChasersReverseLookup.Remove(self);
            }
        }
        public void GeoControl_Start(On.GeoControl.orig_Start orig, GeoControl self)
        {
            spriteDefinition = self.GetComponent <tk2dSprite>().GetCurrentSpriteDef();
            material         = spriteDefinition.material;

            //save default texture because we dont have a copy
            if (ckTex.defaultTex == null)
            {
                ckTex.defaultTex = (Texture2D)material.mainTexture;
            }
            var geoTexture = ckTex.currentTexture;

            if (geoTexture != null && material != null)
            {
                material.mainTexture = geoTexture;
            }
            On.GeoControl.Start -= GeoControl_Start;
            orig(self);
        }
示例#4
0
        private void ProcessGeoUpdate(On.GeoControl.orig_FixedUpdate orig, GeoControl self)
        {
            if ((bool)geoAttracted.GetValue(self))
            {
                //Remove rocks with no hits left
                foreach (GeoRock rock in rocks.Keys.ToList())
                {
                    UpdateHitsOnRock.Invoke(rock, null);
                    if (rock.geoRockData.hitsLeft <= 0)
                    {
                        rocks.Remove(rock);
                        if (rockChasers.ContainsKey(rock))
                        {
                            rockChasersReverseLookup.Remove(rockChasers[rock]);
                            rockChasers.Remove(rock);
                        }
                    }
                }

                //If this geo is already after a rock, use that. Otherwise get the closest one
                GeoRock closest;
                if (rockChasersReverseLookup.ContainsKey(self))
                {
                    closest = rockChasersReverseLookup[self];
                }
                else
                {
                    closest = GetClosestRock(self);
                }

                //orig(self) makes it go after the hero if there's no rocks to chase
                if (closest == null)
                {
                    orig(self);
                }
                else
                {
                    //Cache this rock-geo pair if it isn't already
                    if (!rockChasers.ContainsKey(closest))
                    {
                        rockChasers.Add(closest, self);
                        rockChasersReverseLookup.Add(self, closest);
                    }

                    Rigidbody2D body = (Rigidbody2D)geoBody.GetValue(self);

                    //Copy pasted from GeoControl.FixedUpdate with hero changed to rock
                    Vector2 vector = new Vector2(closest.transform.position.x - self.transform.position.x, closest.transform.position.y - 0.5f - self.transform.position.y);
                    vector = Vector2.ClampMagnitude(vector, 1f);
                    vector = new Vector2(vector.x * 150f, vector.y * 150f);
                    body.AddForce(vector);
                    Vector2 vector2 = body.velocity;
                    vector2       = Vector2.ClampMagnitude(vector2, 20f);
                    body.velocity = vector2;

                    //Can't get collision/trigger enter events working
                    PlayMakerFSM rockFSM = rocks[closest];
                    if (DistBetween(self.transform.position, closest.transform.position) <= 1f && (rockFSM.ActiveStateName == "Idle" || rockFSM.ActiveStateName == "Gleam"))
                    {
                        rockFSM.SetState("Hit");
                    }
                }
            }
        }