protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);

            /*
             * Null checking is very important in RimWorld.
             * 99% of errors reported are from NullReferenceExceptions (NREs).
             * Make sure your code checks if things actually exist, before they
             * try to use the code that belongs to said things.
             */
            if (hitThing != null) //Fancy way to declare a variable inside an if statement. - Thanks Erdelf.
            {
                Log.Message("got into the if statement", true);
                Log.Warning("hitThing = " + hitThing.ToString(), true);
                var rand = Rand.Value; // This is a random percentage between 0% and 100%
                GenExplosion.DoExplosion(hitThing.Position, hitThing.Map, 3.9f, DamageDefOf.Bomb, this, 15, 0);
                GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);

                int hitPosX = hitThing.Position.x;
                int hitPosY = hitThing.Position.y;
                for (int g = -3; g < 3; g++)
                {
                    for (int i = -3; i < 3; i++)
                    {
                        IntVec3 positionWhatever = new IntVec3(hitThing.Position.x + i, hitThing.Position.y, hitThing.Position.z + g);
                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            int beersToMake = Math.Abs(Math.Abs(g) - 3) + Math.Abs(Math.Abs(i) - 3);
                            for (int b = 0; b < beersToMake; b++)
                            {
                                GenSpawn.Spawn(ThingDefOf.SmokeleafJoint, positionWhatever, hitThing.Map);
                            }
                        }
                    }
                }
            }
            else if (this.launcher.Map != null)
            {
                GenExplosion.DoExplosion(this.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this, 1, 0);
                GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);

                int hitPosX = this.Position.x;
                int hitPosY = this.Position.y;
                for (int g = -3; g < 3; g++)
                {
                    for (int i = -3; i < 3; i++)
                    {
                        IntVec3 positionWhatever = new IntVec3(this.Position.x + i, this.Position.y, this.Position.z + g);
                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            int beersToMake = Math.Abs(Math.Abs(g) - 3) + Math.Abs(Math.Abs(i) - 3);
                            for (int b = 0; b < beersToMake; b++)
                            {
                                GenSpawn.Spawn(ThingDefOf.SmokeleafJoint, positionWhatever, this.launcher.Map);
                            }
                        }
                    }
                }
            }
        }
Exemple #2
0
        protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);

            int itemDefArraySize = DefDatabase <ThingDef> .DefCount;

            Log.Message("the number of item defs in the thing def database is: " + itemDefArraySize, true);
            Log.Message("About to sort through " + itemDefArraySize + " things in DefDatabase<ThingDef>.All", true);
            List <ThingDef> listOfThings = new List <ThingDef>();
            int             thingsCount  = 0;

            foreach (ThingDef currentThing in DefDatabase <ThingDef> .AllDefs)
            {
                if (currentThing.IsWithinCategory(ThingCategoryDefOf.Drugs) || currentThing.IsWithinCategory(ThingCategoryDefOf.FoodMeals) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Foods) || currentThing.IsWithinCategory(ThingCategoryDefOf.Leathers) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Manufactured) || currentThing.IsWithinCategory(ThingCategoryDefOf.MeatRaw) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Medicine) || currentThing.IsWithinCategory(ThingCategoryDefOf.PlantFoodRaw) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.ResourcesRaw) || currentThing.IsWithinCategory(ThingCategoryDefOf.StoneBlocks) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.StoneChunks))
                {
                    //Log.Message("- " + currentThing.label, true);

                    /*I don't understand lists, have never used them in a real world scenario to accomplish anything meaningful so I
                     * really hope that this doesn't cause a zillion null exceptions in Rimworld*/
                    if (!currentThing.label.Contains("Unfinished") && !currentThing.label.Contains("persona") && !currentThing.label.Contains("doomsday") &&
                        !currentThing.label.Contains("unfinished") && !currentThing.label.Contains("Psychic") && !currentThing.label.Contains("subpersona"))
                    {
                        listOfThings.Add(currentThing);
                        thingsCount++;
                        //Log.Message("- " + currentThing.label, true);
                    }
                }
            }

            //strangely, there are some items NOT contained in the thing def database. My list only excludes buildings and some other pointless junk
            //I can add the excluded things in manually. Most of them are in the already decalred in the ThingDefOf class
            listOfThings.Add(ThingDefOf.Steel); thingsCount++;
            listOfThings.Add(ThingDefOf.BlocksGranite); thingsCount++;
            listOfThings.Add(ThingDefOf.Gold); thingsCount++;
            listOfThings.Add(ThingDefOf.Silver); thingsCount++;
            listOfThings.Add(ThingDefOf.Uranium); thingsCount++;
            listOfThings.Add(ThingDefOf.Plasteel); thingsCount++;
            listOfThings.Add(ThingDefOf.ChunkSlagSteel); thingsCount++;

            //Log.Message("Done. wrote " + thingsCount + " things to a bigass list", true);


            //ok on to the other shit
            if (hitThing != null || this.launcher.Map != null) //Fancy way to declare a variable inside an if statement. - Thanks Erdelf.
            {
                //Log.Warning("hitThing = " + hitThing.ToString(), true);
                var rand = Rand.Value; // This is a random percentage between 0% and 100%
                //GenExplosion.DoExplosion(hitThing.Position, hitThing.Map, 3.9f, DamageDefOf.Bomb, this, 15, 0);
                //GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);

                int hitPosX; // = hitThing.Position.x;
                int hitPosY; // = hitThing.Position.y;
                int hitPosZ; // = hitThing.Position.z;
                if (hitThing == null)
                {
                    hitPosX = this.launcher.Position.x;
                    hitPosY = this.launcher.Position.y;
                    hitPosZ = this.launcher.Position.z;
                }
                else
                {
                    hitPosX = hitThing.Position.x;
                    hitPosY = hitThing.Position.y;
                    hitPosZ = hitThing.Position.z;
                }
                //Log.Message("about to spawn a zillion items in for loop 1", true);
                for (int g = -5; g < 5; g++)
                {
                    for (int i = -5; i < 5; i++)
                    {
                        //Random r2 = new Random();
                        //int r2Int = r2.Next(0, 34);
                        IntVec3  positionWhatever  = new IntVec3(hitPosX + i, hitPosY, hitPosZ + g);
                        ThingDef thingyWhateverFoo = listOfThings.RandomElement <ThingDef>();
                        Thing    thingThatsAboutToBeSpawned;
                        int      numThingsToSpawn;

                        //this is meant to combat the issue of there being too many body parts spawning everywhere
                        //It's only so funny for so long, you know ?
                        //I left it possible for the user to toggle this feature on and off via the xml file
                        if (thingyWhateverFoo.MadeFromStuff)
                        {
                            thingThatsAboutToBeSpawned = ThingMaker.MakeThing(thingyWhateverFoo, ThingDefOf.Steel);
                            numThingsToSpawn           = 1;
                        }
                        else
                        {
                            thingThatsAboutToBeSpawned = ThingMaker.MakeThing(thingyWhateverFoo);
                            numThingsToSpawn           = Math.Abs(Math.Abs(g) - 5) + Math.Abs(Math.Abs(i) - 5);
                        }
                        int qtyMult = 1;
                        if (thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.Leathers) || thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.Foods) ||
                            thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.Drugs) || thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.ResourcesRaw) ||
                            thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.PlantMatter) || thingyWhateverFoo == ThingDefOf.Steel ||
                            thingyWhateverFoo == ThingDefOf.Gold || thingyWhateverFoo == ThingDefOf.Silver || thingyWhateverFoo == ThingDefOf.Plasteel ||
                            thingyWhateverFoo == ThingDefOf.Uranium || thingyWhateverFoo == ThingDefOf.BlocksGranite)
                        {
                            qtyMult = new Random().Next(6, 20);
                            Log.Message("Found an item to change to spawn amount of. It's " + thingyWhateverFoo.label + " and the spawn amount will be " + (numThingsToSpawn + qtyMult), true);
                        }

                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            for (int b = 0; b < numThingsToSpawn * qtyMult; b++)
                            {
                                //Log.Message("r2Int = " + r2Int, true);

                                //don't spawn over a building. This causes it to deconstruct once you save and reload
                                if (thingyWhateverFoo.MadeFromStuff)
                                {
                                    GenSpawn.Spawn(thingThatsAboutToBeSpawned, positionWhatever, hitThing.Map);
                                }
                                else
                                {
                                    GenSpawn.Spawn(thingyWhateverFoo, positionWhatever, hitThing.Map);
                                }
                            }
                        }
                    }
                }
                //Log.Message("done", true);
            }

            /*else if (this.launcher.Map != null)
             * {
             *  GenExplosion.DoExplosion(this.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this, 1, 0);
             *  GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);
             *
             *  int hitPosX = this.Position.x;
             *  int hitPosY = this.Position.y;
             *  for (int g = -5; g < 5; g++)
             *  {
             *      for (int i = -5; i < 5; i++)
             *      {
             *          Random r3 = new Random();
             *          int r3Int = r3.Next(0, 34);
             *          IntVec3 positionWhatever = new IntVec3(this.Position.x + i, this.Position.y, this.Position.z + g);
             *          int beersToMake = Math.Abs(Math.Abs(g) - 5) + Math.Abs(Math.Abs(i) - 5);
             *          for (int b = 0; b < beersToMake; b++)
             *          {
             *              GenSpawn.Spawn(thingArray[r3Int], positionWhatever, this.launcher.Map);
             *          }
             *      }
             *  }
             * }*/
        }
Exemple #3
0
        protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);

            bool limitValue        = Def.limitItemValue;
            bool limitQtyBodyParts = Def.limitQtyBodyParts;

            Log.Message("did the first one", true);
            int maxValueLimit = Def.maxValueLimit;

            Log.Message("Limitvalue = " + limitValue, true);
            Log.Message("value limit = " + maxValueLimit, true);
            int itemDefArraySize = DefDatabase <ThingDef> .DefCount;

            Log.Message("the number of item defs in the thing def database is: " + itemDefArraySize, true);
            Log.Message("About to sort through " + itemDefArraySize + " things in DefDatabase<ThingDef>.All", true);
            List <ThingDef> listOfThings = new List <ThingDef>();
            int             thingsCount  = 0;

            foreach (ThingDef currentThing in DefDatabase <ThingDef> .AllDefs)
            {
                if (currentThing.IsWithinCategory(ThingCategoryDefOf.Items) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Drugs) || currentThing.IsWithinCategory(ThingCategoryDefOf.FoodMeals) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Foods) || currentThing.IsWithinCategory(ThingCategoryDefOf.Leathers) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Manufactured) || currentThing.IsWithinCategory(ThingCategoryDefOf.MeatRaw) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.Medicine) || currentThing.IsWithinCategory(ThingCategoryDefOf.PlantFoodRaw) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.ResourcesRaw) || currentThing.IsWithinCategory(ThingCategoryDefOf.StoneBlocks) ||
                    currentThing.IsWithinCategory(ThingCategoryDefOf.StoneChunks) || currentThing.IsWithinCategory(ThingCategoryDefOf.Weapons))
                {
                    //Log.Message("- " + currentThing.label, true);

                    /*I don't understand lists, have never used them in a real world scenario to accomplish anything meaningful so I
                     * really hope that this doesn't cause a zillion null exceptions in Rimworld*/
                    if (!currentThing.label.Contains("Unfinished") && !currentThing.label.Contains("persona") && !currentThing.label.Contains("doomsday") &&
                        !currentThing.label.Contains("unfinished") && !currentThing.label.Contains("Psychic") && !currentThing.label.Contains("subpersona"))
                    {
                        if (limitValue == true)
                        {
                            if (currentThing.BaseMarketValue < maxValueLimit || currentThing.IsWithinCategory(ThingCategoryDefOf.BodyParts))
                            {
                                listOfThings.Add(currentThing);
                                thingsCount++;
                                Log.Message("- " + currentThing.label, true);
                            }
                        }
                        else
                        {
                            listOfThings.Add(currentThing);
                            thingsCount++;
                        }
                    }
                }
            }

            //strangely, there are some items NOT contained in the thing def database. My list only excludes buildings and some other pointless junk
            //I can add the excluded things in manually. Most of them are in the already decalred in the ThingDefOf class
            listOfThings.Add(ThingDefOf.Steel); thingsCount++;
            listOfThings.Add(ThingDefOf.BlocksGranite); thingsCount++;
            listOfThings.Add(ThingDefOf.Gold); thingsCount++;
            listOfThings.Add(ThingDefOf.Silver); thingsCount++;
            listOfThings.Add(ThingDefOf.Uranium); thingsCount++;
            listOfThings.Add(ThingDefOf.Plasteel); thingsCount++;
            listOfThings.Add(ThingDefOf.ChunkSlagSteel); thingsCount++;

            Log.Message("Done. wrote " + thingsCount + " things to a bigass list", true);

            //this is the part about the thingdef array

            /*ThingDef[] thingArray = new ThingDef[35];
             * int j = 0;
             * thingArray[j] = ThingDefOf.Beer; j++;
             * thingArray[j] = ThingDefOf.BlocksGranite; j++;
             * thingArray[j] = ThingDefOf.Chemfuel; j++;
             * thingArray[j] = ThingDefOf.Chocolate; j++;
             * thingArray[j] = ThingDefOf.ChunkSlagSteel; j++;
             * thingArray[j] = ThingDefOf.Cloth; j++;
             * thingArray[j] = ThingDefOf.ElephantTusk; j++;
             * thingArray[j] = ThingDefOf.Hay; j++;
             * thingArray[j] = ThingDefOf.Heart; j++;
             * thingArray[j] = ThingDefOf.Gold; j++;
             * thingArray[j] = ThingDefOf.Granite; j++;
             * thingArray[j] = ThingDefOf.Hyperweave; j++;
             * thingArray[j] = ThingDefOf.InsectJelly; j++;
             * thingArray[j] = ThingDefOf.Kibble; j++;
             * thingArray[j] = ThingDefOf.Leather_Plain; j++;
             * thingArray[j] = ThingDefOf.Luciferium; j++;
             * thingArray[j] = ThingDefOf.MealFine; j++;
             * thingArray[j] = ThingDefOf.MealNutrientPaste; j++;
             * thingArray[j] = ThingDefOf.MealSimple; j++;
             * thingArray[j] = ThingDefOf.MealSurvivalPack; j++;
             * thingArray[j] = ThingDefOf.Meat_Human; j++;
             * thingArray[j] = ThingDefOf.MedicineHerbal; j++;
             *
             * thingArray[j] = ThingDefOf.MedicineUltratech; j++;
             * thingArray[j] = ThingDefOf.Pemmican; j++;
             * thingArray[j] = ThingDefOf.Plasteel; j++;
             * thingArray[j] = ThingDefOf.RawBerries; j++;
             * thingArray[j] = ThingDefOf.RawPotatoes; j++;
             * thingArray[j] = ThingDefOf.ShipChunk; j++;
             * thingArray[j] = ThingDefOf.Silver; j++;
             * thingArray[j] = ThingDefOf.SmokeleafJoint; j++;
             * thingArray[j] = ThingDefOf.Snowman; j++;
             * thingArray[j] = ThingDefOf.Steel; j++;
             * thingArray[j] = ThingDefOf.Uranium; j++;
             * thingArray[j] = ThingDefOf.WoodLog; j++;
             * thingArray[j] = ThingDefOf.Wort; j++;
             *
             * Log.Message("decalred all the items", true);*/
            /*
             * Null checking is very important in RimWorld.
             * 99% of errors reported are from NullReferenceExceptions (NREs).
             * Make sure your code checks if things actually exist, before they
             * try to use the code that belongs to said things.
             */

            //try this maybe it wont crash
            var randS = Rand.Value; // This is a random percentage between 0% and 100%

            GenExplosion.DoExplosion(this.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this, 0, 0);
            GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);
            Map thisMap = this.launcher.Map;

            PawnKindDef[] pawnKindDefArray;
            pawnKindDefArray = new PawnKindDef[DefDatabase <PawnKindDef> .DefCount];

            int pawnsCount = 0;

            foreach (PawnKindDef kindDef in DefDatabase <PawnKindDef> .AllDefs)
            {
                if (!kindDef.ToString().Contains("Mech_") && !kindDef.ToString().Contains("Mercenary_") && !kindDef.ToString().Contains("Grenadier_") && !kindDef.ToString().Contains("Tribal_") &&
                    !kindDef.ToString().Contains("Town") /*&& !kindDef.ToString().Contains("Drifter")*/ && kindDef.ToString() != "WildMan" && kindDef.ToString() != "Scavenger" && kindDef.ToString() != "Thrasher" &&
                    !kindDef.ToString().Contains("Pirate") && kindDef.ToString() != "Slave" && kindDef.ToString() != "AncientSoldier" &&
                    kindDef.ToString() != "Villager" && kindDef.ToString() != "Tribesperson" && kindDef.ToString() != "StrangerInBlack" && kindDef.ToString() != "SpaceRefugee")
                {
                    pawnKindDefArray[pawnsCount] = kindDef;
                    pawnsCount++;
                }
            }
            //Log.Message("declared all the pawns", true);
            Random r        = new Random();
            int    rInt     = r.Next(0, pawnsCount - 1);
            int    hitPos3X = this.Position.x;
            int    hitPos3Y = this.Position.y;

            for (int g = -3; g < 3; g++)
            {
                for (int i = -3; i < 3; i++)
                {
                    IntVec3 positionWhatever = new IntVec3(this.Position.x + i, this.Position.y, this.Position.z + g);
                    Pawn    newThing         = PawnGenerator.GeneratePawn(pawnKindDefArray[rInt]);
                    GenSpawn.Spawn(newThing, positionWhatever, thisMap);
                    rInt = r.Next(0, pawnsCount - 2);
                }
            }
            //Log.Message("done with pawn spawning", true);

            //ok on to the other shit
            if (hitThing != null || this.launcher.Map != null) //Fancy way to declare a variable inside an if statement. - Thanks Erdelf.
            {
                //Log.Warning("hitThing = " + hitThing.ToString(), true);
                var rand = Rand.Value; // This is a random percentage between 0% and 100%
                GenExplosion.DoExplosion(hitThing.Position, hitThing.Map, 3.9f, DamageDefOf.Bomb, this, 15, 0);
                GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);

                int hitPosX; // = hitThing.Position.x;
                int hitPosY; // = hitThing.Position.y;
                int hitPosZ; // = hitThing.Position.z;
                if (hitThing == null)
                {
                    hitPosX = this.launcher.Position.x;
                    hitPosY = this.launcher.Position.y;
                    hitPosZ = this.launcher.Position.z;
                }
                else
                {
                    hitPosX = hitThing.Position.x;
                    hitPosY = hitThing.Position.y;
                    hitPosZ = hitThing.Position.z;
                }
                //Log.Message("about to spawn a zillion items in for loop 1", true);
                for (int g = -5; g < 5; g++)
                {
                    for (int i = -5; i < 5; i++)
                    {
                        //Random r2 = new Random();
                        //int r2Int = r2.Next(0, 34);
                        IntVec3  positionWhatever  = new IntVec3(hitPosX + i, hitPosY, hitPosZ + g);
                        ThingDef thingyWhateverFoo = listOfThings.RandomElement <ThingDef>();
                        Thing    thingThatsAboutToBeSpawned;
                        int      numThingsToSpawn;

                        //this is meant to combat the issue of there being too many body parts spawning everywhere
                        //It's only so funny for so long, you know ?
                        //I left it possible for the user to toggle this feature on and off via the xml file
                        if (thingyWhateverFoo.MadeFromStuff)
                        {
                            thingThatsAboutToBeSpawned = ThingMaker.MakeThing(thingyWhateverFoo, ThingDefOf.Steel);
                            numThingsToSpawn           = 1;
                        }
                        else
                        {
                            thingThatsAboutToBeSpawned = ThingMaker.MakeThing(thingyWhateverFoo);
                            numThingsToSpawn           = Math.Abs(Math.Abs(g) - 5) + Math.Abs(Math.Abs(i) - 5);
                        }
                        int qtyMult = 1;
                        if (thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.Leathers) || thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.Foods) ||
                            thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.Drugs) || thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.ResourcesRaw) ||
                            thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.PlantMatter) || thingyWhateverFoo == ThingDefOf.Steel ||
                            thingyWhateverFoo == ThingDefOf.Gold || thingyWhateverFoo == ThingDefOf.Silver || thingyWhateverFoo == ThingDefOf.Plasteel ||
                            thingyWhateverFoo == ThingDefOf.Uranium || thingyWhateverFoo == ThingDefOf.BlocksGranite)
                        {
                            qtyMult = new Random().Next(6, 20);
                            Log.Message("Found an item to change to spawn amount of. It's " + thingyWhateverFoo.label + " and the spawn amount will be " + (numThingsToSpawn + qtyMult), true);
                        }
                        else
                        if (thingyWhateverFoo.IsWithinCategory(ThingCategoryDefOf.BodyParts) && limitQtyBodyParts == true)
                        {
                            numThingsToSpawn = new Random().Next(1, 2);
                            qtyMult          = 1;
                        }
                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            for (int b = 0; b < numThingsToSpawn * qtyMult; b++)
                            {
                                //Log.Message("r2Int = " + r2Int, true);
                                if (thingyWhateverFoo.MadeFromStuff)
                                {
                                    GenSpawn.Spawn(thingThatsAboutToBeSpawned, positionWhatever, hitThing.Map);
                                }
                                else
                                {
                                    GenSpawn.Spawn(thingyWhateverFoo, positionWhatever, hitThing.Map);
                                }
                            }
                        }
                    }
                }
                //Log.Message("done", true);
            }

            /*else if (this.launcher.Map != null)
             * {
             *  GenExplosion.DoExplosion(this.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this, 1, 0);
             *  GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);
             *
             *  int hitPosX = this.Position.x;
             *  int hitPosY = this.Position.y;
             *  for (int g = -5; g < 5; g++)
             *  {
             *      for (int i = -5; i < 5; i++)
             *      {
             *          Random r3 = new Random();
             *          int r3Int = r3.Next(0, 34);
             *          IntVec3 positionWhatever = new IntVec3(this.Position.x + i, this.Position.y, this.Position.z + g);
             *          int beersToMake = Math.Abs(Math.Abs(g) - 5) + Math.Abs(Math.Abs(i) - 5);
             *          for (int b = 0; b < beersToMake; b++)
             *          {
             *              GenSpawn.Spawn(thingArray[r3Int], positionWhatever, this.launcher.Map);
             *          }
             *      }
             *  }
             * }*/
        }
        protected override void Impact(Thing hitThing)
        {
            //base.Impact(hitThing);

            /*
             * Null checking is very important in RimWorld.
             * 99% of errors reported are from NullReferenceExceptions (NREs).
             * Make sure your code checks if things actually exist, before they
             * try to use the code that belongs to said things.
             */
            if (hitThing != null) //Fancy way to declare a variable inside an if statement. - Thanks Erdelf.
            {
                Log.Message("got into the if statement", true);
                Log.Warning("hitThing = " + hitThing.ToString() + "also, 42", true);
                Log.Warning("base.Position = " + base.Position.ToString(), true);
                Log.Warning("this.launcher.Map = " + this.launcher.Map.ToString(), true);
                Log.Warning("DamageDefOf.Bomb = " + DamageDefOf.Bomb.ToString(), true);
                Log.Warning("this.launcher = " + this.launcher.ToString(), true);
                //Log.Warning("Def.damageAmountBase = " + Def.damageAmountBase.ToString(), true);
                //var rand = Rand.Value; // This is a random percentage between 0% and 100%
                GenExplosion.DoExplosion(base.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this.launcher, 0, 0);
                //GenClamor.DoClamor(hitThing, 3.9f, ClamorDefOf.Impact);
                Log.Warning("executed explosion line. about to go to for loop", true);

                //int hitPosX = hitThing.Position.x;
                //int hitPosY = hitThing.Position.y;
                for (int g = -3; g < 3; g++)
                {
                    for (int i = -3; i < 3; i++)
                    {
                        IntVec3 positionWhatever = new IntVec3(base.Position.x + i, base.Position.y, base.Position.z + g);
                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            int beersToMake = Math.Abs(Math.Abs(g) - 3) + Math.Abs(Math.Abs(i) - 3);
                            for (int b = 0; b < beersToMake; b++)
                            {
                                GenSpawn.Spawn(ThingDefOf.Beer, positionWhatever, hitThing.Map);
                            }
                        }
                    }
                }
                Log.Warning("exited for loop. About to run destroy", true);
                this.Destroy();
            }
            else/*(this.launcher.Map != null)*/
            {
                Log.Message("In the \"if hitthing == null\" loop", true);
                GenExplosion.DoExplosion(base.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this.launcher, 0, 0);
                GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);

                int hitPosX = this.Position.x;
                int hitPosY = this.Position.y;
                for (int g = -3; g < 3; g++)
                {
                    for (int i = -3; i < 3; i++)
                    {
                        IntVec3 positionWhatever = new IntVec3(base.Position.x + i, base.Position.y, base.Position.z + g);
                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            int beersToMake = Math.Abs(Math.Abs(g) - 3) + Math.Abs(Math.Abs(i) - 3);
                            for (int b = 0; b < beersToMake; b++)
                            {
                                GenSpawn.Spawn(ThingDefOf.Beer, positionWhatever, this.launcher.Map);
                            }
                        }
                    }
                }
                this.Destroy();
            }
            //this.Destroy();
        }
        protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);

            Log.Message("about to attemp to load the def variables..", true);
            int  limitGunValue = Def.limitGunValue;
            int  effectRadius  = Def.effectRadius;
            bool excludeOpGuns = Def.excludeOpGuns;
            bool spawnFewMelee = Def.spawnFewMelee;

            Log.Message("If you are reading this, the def variables sucessfully got read and loaded", true);
            int itemDefArraySize = DefDatabase <ThingDef> .DefCount;

            Log.Message("the number of item defs in the thing def database is: " + itemDefArraySize, true);
            Log.Message("About to sort through " + itemDefArraySize + " things in DefDatabase<ThingDef>.All", true);
            List <ThingDef> listOfThings = new List <ThingDef>();
            int             thingsCount  = 0;

            foreach (ThingDef currentThing in DefDatabase <ThingDef> .AllDefs)
            {
                if (currentThing.IsWithinCategory(ThingCategoryDefOf.Weapons))
                {
                    //Log.Message("- " + currentThing.label, true);

                    /*I don't understand lists, have never used them in a real world scenario to accomplish anything meaningful so I
                     * really hope that this doesn't cause a zillion null exceptions in Rimworld*/
                    if (!currentThing.label.Contains("Unfinished") && !currentThing.label.Contains("uranium") && !currentThing.label.Contains("unfinished") && !currentThing.label.Contains("Psychic") && !currentThing.label.Contains("subpersona") && !currentThing.label.Contains("turret"))
                    {
                        if (limitGunValue == 0 || currentThing.BaseMarketValue < limitGunValue)
                        {
                            listOfThings.Add(currentThing);
                            thingsCount++;
                        }
                        //Log.Message("- " + currentThing.label, true);
                    }
                }
            }

            //strangely, there are some items NOT contained in the thing def database. My list only excludes buildings and some other pointless junk
            //I can add the excluded things in manually. Most of them are in the already decalred in the ThingDefOf class

            //Log.Message("Done. wrote " + thingsCount + " things to a bigass list", true);


            //ok on to the other shit
            if (hitThing != null || base.Position != null) //Fancy way to declare a variable inside an if statement. - Thanks Erdelf.
            {
                //Log.Warning("hitThing = " + hitThing.ToString(), true);
                var rand = Rand.Value; // This is a random percentage between 0% and 100%
                //GenExplosion.DoExplosion(hitThing.Position, hitThing.Map, 3.9f, DamageDefOf.Bomb, this, 15, 0);
                //GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);

                int hitPosX; // = hitThing.Position.x;
                int hitPosY; // = hitThing.Position.y;
                int hitPosZ; // = hitThing.Position.z;
                if (hitThing == null)
                {
                    hitPosX = base.Position.x;
                    hitPosY = base.Position.y;
                    hitPosZ = base.Position.z;
                }
                else
                {
                    hitPosX = hitThing.Position.x;
                    hitPosY = hitThing.Position.y;
                    hitPosZ = hitThing.Position.z;
                }
                //Log.Message("about to spawn a zillion items in for loop 1", true);
                for (int g = -effectRadius; g < effectRadius; g++)
                {
                    for (int i = -effectRadius; i < effectRadius; i++)
                    {
                        //Random r2 = new Random();
                        //int r2Int = r2.Next(0, 34);
                        IntVec3  positionWhatever  = new IntVec3(hitPosX + i, hitPosY, hitPosZ + g);
                        ThingDef thingyWhateverFoo = listOfThings.RandomElement <ThingDef>();
                        Thing    thingThatsAboutToBeSpawned;
                        int      numThingsToSpawn = 1;

                        if (!thingyWhateverFoo.IsRangedWeapon)
                        {
                            //bool meleeOK;
                            if (new Random().Next(0, 1000) < 50 && spawnFewMelee == true)
                            {
                                //cool. do nothing then
                            }
                            else
                            {
                                //bool foundRanged = false;
                                while (!thingyWhateverFoo.IsRangedWeapon)
                                {
                                    thingyWhateverFoo = listOfThings.RandomElement <ThingDef>();
                                }
                            }
                        }

                        if (thingyWhateverFoo.MadeFromStuff)
                        {
                            thingThatsAboutToBeSpawned = ThingMaker.MakeThing(thingyWhateverFoo, ThingDefOf.Steel);
                            numThingsToSpawn           = 1;
                        }
                        else
                        {
                            thingThatsAboutToBeSpawned = ThingMaker.MakeThing(thingyWhateverFoo);
                            //numThingsToSpawn = Math.Abs(Math.Abs(g) - 5) + Math.Abs(Math.Abs(i) - 5);
                            numThingsToSpawn = 1;
                        }
                        int qtyMult = 1;

                        if (!MiscCrap.IsBuilingHere(this.launcher.Map, positionWhatever))
                        {
                            for (int b = 0; b < numThingsToSpawn * qtyMult; b++)
                            {
                                //Log.Message("r2Int = " + r2Int, true);

                                //don't spawn over a building. This causes it to deconstruct once you save and reload
                                if (thingyWhateverFoo.MadeFromStuff)
                                {
                                    GenSpawn.Spawn(thingThatsAboutToBeSpawned, positionWhatever, this.launcher.Map);
                                }
                                else
                                {
                                    GenSpawn.Spawn(thingyWhateverFoo, positionWhatever, this.launcher.Map);
                                }
                            }
                        }
                    }
                }
                //Log.Message("done", true);
            }

            /*else if (this.launcher.Map != null)
             * {
             *  GenExplosion.DoExplosion(this.Position, this.launcher.Map, 3.9f, DamageDefOf.Bomb, this, 1, 0);
             *  GenClamor.DoClamor(this, 3.9f, ClamorDefOf.Impact);
             *
             *  int hitPosX = this.Position.x;
             *  int hitPosY = this.Position.y;
             *  for (int g = -5; g < 5; g++)
             *  {
             *      for (int i = -5; i < 5; i++)
             *      {
             *          Random r3 = new Random();
             *          int r3Int = r3.Next(0, 34);
             *          IntVec3 positionWhatever = new IntVec3(this.Position.x + i, this.Position.y, this.Position.z + g);
             *          int beersToMake = Math.Abs(Math.Abs(g) - 5) + Math.Abs(Math.Abs(i) - 5);
             *          for (int b = 0; b < beersToMake; b++)
             *          {
             *              GenSpawn.Spawn(thingArray[r3Int], positionWhatever, this.launcher.Map);
             *          }
             *      }
             *  }
             * }*/
        }
Exemple #6
0
        protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);

            /*
             * Null checking is very important in RimWorld.
             * 99% of errors reported are from NullReferenceExceptions (NREs).
             * Make sure your code checks if things actually exist, before they
             * try to use the code that belongs to said things.
             */

            //only do stuff if it is a pawn.
            if (Def != null && hitThing != null && hitThing is Pawn hitPawn) //Fancy way to declare a variable inside an if statement. - Thanks Erdelf.
            {
                var rand = Rand.Value;                                       // This is a random percentage between 0% and 100%

                Map         thisMap           = hitThing.Map;
                PawnKindDef clonedPawnKindDef = hitPawn.kindDef;

                //Log.Message("pawnKindDef.ToString() = " + pawnKindDef.ToString(), true);
                Pawn newThing = PawnGenerator.GeneratePawn(clonedPawnKindDef);
                //newThing.gender = hitPawn.gender;
                Log.Message("ishuman = " + newThing.RaceProps.Humanlike, true);
                if (hitPawn.RaceProps.Humanlike)
                {
                    //newThing.kindDef.race = hitPawn.kindDef.race;
                    //make an exact copy of the hit pawn. I can't just set the pawn variables equal to each other because of random complications
                    //it's easier to do this than to work around the complications causing just "newthing = hitpawn" to not work
                    newThing.inventory      = hitPawn.inventory;
                    newThing.RaceProps.body = hitPawn.RaceProps.body;
                    newThing.gender         = hitPawn.gender;
                    newThing.skills         = hitPawn.skills;
                    newThing.story.traits   = hitPawn.story.traits;
                    newThing.apparel        = hitPawn.apparel;
                    newThing.ageTracker     = hitPawn.ageTracker;
                    newThing.SetFaction(hitPawn.Faction);
                    newThing.equipment       = hitPawn.equipment;
                    newThing.story.hairDef   = hitPawn.story.hairDef;
                    newThing.story.bodyType  = hitPawn.story.bodyType;
                    newThing.story.melanin   = hitPawn.story.melanin;
                    newThing.story.crownType = hitPawn.story.crownType;
                    newThing.story.hairColor = hitPawn.story.hairColor;
                    newThing.story.adulthood = hitPawn.story.adulthood;
                    newThing.story.childhood = hitPawn.story.childhood;

                    //fully heal the pawn. Give them a fresh start!
                    MiscCrap.FullyHealPawn(newThing);
                }
                else
                {
                    newThing.gender = hitPawn.gender;
                    newThing.SetFaction(hitPawn.Faction);
                }
                //Pawn newThing = hitPawn;
                //hitPawn.Name = NameGenerator.GenerateName()
                //newThing.records.AccumulateStoryEvent(StoryEventDef)
                IntVec3 clonedPawnPosition = new IntVec3(hitPawn.Position.x + (new Random().Next(-1, 1)), hitPawn.Position.y, hitPawn.Position.z + (new Random().Next(-1, 1)));
                GenSpawn.Spawn(newThing, clonedPawnPosition, thisMap);
                //Log.Message("newThing kind def = " + newThing.kindDef.ToString());
                //hitThing.Map.wildAnimalSpawner.SpawnRandomWildAnimalAt(hitThing.Position);
                //hitPawn.DeSpawn();
            }
            else
            {
                Pawn newPawn = PawnGenerator.GeneratePawn(DefDatabase <PawnKindDef> .GetNamed("Colonist"));
                if (this.launcher.Position.GetFirstPawn(this.launcher.Map) != null)
                {
                    newPawn.SetFaction(Faction.OfPlayer, this.launcher.Position.GetFirstPawn(this.launcher.Map));
                }
                else
                {
                    newPawn.SetFaction(Faction.OfPlayer);
                }
                MiscCrap.FilterTraits(newPawn);
                MiscCrap.FullyHealPawn(newPawn);
                GenSpawn.Spawn(newPawn, new IntVec3(base.Position.x + (new Random().Next(-1, 1)), base.Position.y, base.Position.z + (new Random().Next(-1, 1))), this.launcher.Map);
            }
        }