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); }
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); }
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"); } } } }