Skip to content

Commit ac1dc65

Browse files
bloons work in sandbox
1 parent 28635b0 commit ac1dc65

10 files changed

Lines changed: 126 additions & 36 deletions

BloonFactory.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace BloonFactory;
2323
public class BloonFactory : BloonsTD6Mod
2424
{
2525
public static readonly ModSettingCategory BloonBrowser = new ModSettingCategory("Bloon Browser");
26+
2627
public static readonly ModSettingBool HideIncompatibleBloons = new(true)
2728
{
2829
category = BloonBrowser,
@@ -34,6 +35,7 @@ public class BloonFactory : BloonsTD6Mod
3435
category = BloonBrowser,
3536
displayName = "Bloons Per Page"
3637
};
38+
3739
public override void OnApplicationStart()
3840
{
3941
ModHelper.Msg<BloonFactory>("BloonFactory loaded!");
@@ -60,7 +62,6 @@ public override void OnNewGameModel(GameModel result)
6062
try
6163
{
6264
var bloonModel = result.bloons.First(bl => bl.id == bloon.BloonTemplate.TemplateId);
63-
MelonLogger.Msg($"Updating Existing BloonModel - {bloon.BloonTemplate.Name}");
6465

6566
bloon.ModifyExistingBloonModel(bloonModel, result.roundSet);
6667
result.bloonsByName[bloonModel.name] = bloonModel;

Categories/ActionCategory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ internal class ActionCategory : Category
1212
{
1313
public override string Name => "Actions";
1414

15-
public override Type[] Modules => [ typeof(SellNearbyTowersActionModule), typeof(BuffNearbyBloonsActionModule), typeof(DestroyNearbyProjectilesActionModule), typeof(DrainLivesActionModule), typeof(DashActionModule), typeof(SetImmuneActionModule), typeof(SpawnBloonsActionModule), typeof(RedirectBloonSpawnActionModule), typeof(StunTowersActionModule), typeof(WaitTimeActionModule), typeof(RemoveAllEffectsActionModule)];
15+
public override Type[] Modules => [ typeof(SellNearbyTowersActionModule), typeof(BuffNearbyBloonsActionModule), typeof(DestroyNearbyProjectilesActionModule), typeof(DrainLivesActionModule), typeof(DashActionModule), typeof(SetImmuneActionModule), typeof(SpawnBloonsActionModule), typeof(RedirectBloonSpawnActionModule), typeof(StunTowersActionModule), typeof(WaitTimeActionModule), typeof(RemoveAllEffectsActionModule), typeof(SetSpeedActionModule)];
1616
}
1717
}

CustomBloon.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public CustomBloon(BloonTemplate template)
3737
public override void ModifyBaseBloonModel(BloonModel bloonModel)
3838
{
3939
bloonModel.name = BloonTemplate.Name;
40-
bloonModel.id = BloonTemplate.Guid.ToString();
40+
bloonModel.id = BloonTemplate.TemplateId;
4141
}
4242
public void ModifyExistingBloonModel(BloonModel model, RoundSetModel roundset)
4343
{
@@ -71,12 +71,12 @@ public void ModifyExistingBloonModel(BloonModel model, RoundSetModel roundset)
7171
}
7272

7373
DamageStateDisplayModule.DamageStateFix(model, BloonTemplate);
74-
74+
MelonLogger.Msg(model.name);
7575
if (model.icon.guidRef == "")
7676
{
77-
MelonLogger.Msg("No icon setting to default");
7877
model.icon = GetSpriteReference("BaseBloon");
7978
}
79+
model.dontShowInSandbox = true;
8080
}
8181
public override IEnumerable<ModContent> Load()
8282
{
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using BloonFactory.LinkTypes;
2+
using BTD_Mod_Helper.Extensions;
3+
using FactoryCore.API;
4+
using FactoryCore.API.ModuleValues;
5+
using Il2CppAssets.Scripts.Data;
6+
using Il2CppAssets.Scripts.Data.Behaviors.Props;
7+
using Il2CppAssets.Scripts.Data.Cosmetics.Props;
8+
using Il2CppAssets.Scripts.Models.Bloons.Behaviors;
9+
using Il2CppAssets.Scripts.Unity;
10+
using Il2CppAssets.Scripts.Unity.UI_New.InGame;
11+
using Il2CppNinjaKiwi.Common.ResourceUtils;
12+
using MelonLoader;
13+
using System;
14+
using System.Collections.Generic;
15+
using System.Linq;
16+
using System.Text;
17+
using System.Threading.Tasks;
18+
19+
namespace BloonFactory.Modules.Actions
20+
{
21+
internal class SetSpeedActionModule : Module
22+
{
23+
public const string BehaviorName = "BloonFactory-SetSpeedActionModule";
24+
public override string Name => "Set Speed";
25+
26+
public override void GetModuleProperties()
27+
{
28+
AddProperty(new FloatModuleProperty("Multiplier", 2, 0, float.MaxValue));
29+
}
30+
public override void GetLinkNodes()
31+
{
32+
AddInput<Trigger>("Trigger");
33+
}
34+
35+
public override void ProcessModule()
36+
{
37+
var trigger = GetInputValue<Trigger>("Trigger");
38+
trigger.bloonModel.AddBehavior(new SetSpeedPercentActionModel(BehaviorName, Id.ToString(), GetValue<float>("Multiplier"), false, 0, 0));
39+
}
40+
}
41+
}

Modules/Display/DamageStateDisplayModule.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public override void ProcessModule()
4040
Visuals visuals = GetInputValue<Visuals>("Visuals");
4141
visuals.bloonModel.disallowCosmetics = true;
4242
var display = new BloonDisplay(GenerateTexture, (BloonTemplate)Template, Id.ToString(), GetValue<float>("Scale"));
43-
MelonLogger.Msg(display.Id);
4443

4544
if (visuals.bloonModel.damageDisplayStates == null)
4645
{

Modules/Spawning/MultipleRoundsModule.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
using FactoryCore.API;
22
using FactoryCore.API.ModuleValues;
33
using Il2CppAssets.Scripts.Models.Rounds;
4-
using System;
5-
using System.Collections.Generic;
6-
using System.Linq;
7-
using System.Text;
8-
using System.Text.Json.Serialization;
9-
using System.Threading.Tasks;
4+
using JsonIgnoreAttribute = Newtonsoft.Json.JsonIgnoreAttribute;
105

116
namespace BloonFactory.Modules.Spawning
127
{

Modules/Tags/CamoTagModule.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using BTD_Mod_Helper.Extensions;
1+
using BTD_Mod_Helper.Api.Enums;
2+
using BTD_Mod_Helper.Extensions;
23
using FactoryCore.API;
34
using FactoryCore.API.ModuleValues;
45
using Il2CppAssets.Scripts.Models.Bloons;
@@ -24,7 +25,11 @@ public override void GetLinkNodes()
2425
}
2526
public override void ProcessModule()
2627
{
27-
GetInputValue<BloonModel>("Bloon").SetCamo(true);
28+
//GetInputValue<BloonModel>("Bloon").SetCamo(true);
29+
30+
var bloon = GetInputValue<BloonModel>("Bloon");
31+
bloon.isCamo = true;
32+
bloon.AddTag(BloonTag.Camo);
2833
}
2934
}
3035
}

Modules/Triggers/HealthPercentTriggerModule.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using BTD_Mod_Helper.Extensions;
33
using FactoryCore.API;
44
using FactoryCore.API.ModuleValues;
5+
using HarmonyLib;
56
using Il2CppAssets.Scripts.Models.Bloons.Behaviors;
7+
using Il2CppAssets.Scripts.Simulation.Bloons.Behaviors;
68
using Il2CppInterop.Runtime.InteropTypes.Arrays;
79
using MelonLoader;
810
using System;
Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,88 @@
1-
using BTD_Mod_Helper.Extensions;
1+
using BTD_Mod_Helper.Api;
2+
using BTD_Mod_Helper.Extensions;
23
using CommandLine;
34
using HarmonyLib;
45
using Il2CppAssets.Scripts.Models;
56
using Il2CppAssets.Scripts.Models.Bloons;
67
using Il2CppAssets.Scripts.Models.Bloons;
78
using Il2CppAssets.Scripts.Unity;
9+
using Il2CppAssets.Scripts.Unity.UI_New.InGame;
810
using Il2CppAssets.Scripts.Unity.UI_New.InGame.BloonMenu;
11+
using Il2CppSystem.Collections.Generic;
912
using MelonLoader;
1013
using System.Linq;
14+
using UnityEngine;
15+
using UnityEngine.UI;
1116

1217
namespace BloonFactory.Patches
1318
{
14-
[HarmonyPatch(typeof(BloonMenu), nameof(BloonMenu.CreateBloonButtons))]
15-
public static class BloonMenu_CreateBloonButtons_Patch
16-
{
17-
[HarmonyPrefix]
18-
public static void Prefix(BloonMenu __instance, Il2CppSystem.Collections.Generic.List<BloonModel> sortedBloons)
19-
{
20-
foreach (var bloon in CustomBloon.Bloons)
21-
{
22-
if (!sortedBloons.Any(a => a.id == bloon.BloonTemplate.TemplateId) && !bloon.BloonTemplate.IsQueueForDeletion)
23-
{
24-
sortedBloons.Add(Game.instance.model.GetBloon(bloon.BloonTemplate.TemplateId));
25-
}
26-
}
27-
}
28-
}
29-
3019
[HarmonyPatch(typeof(GameModel), nameof(GameModel.GetBloon))]
3120
internal static class GameModel_GetBloon
3221
{
3322
[HarmonyPostfix]
3423
private static bool Prefix(GameModel __instance, string id, ref BloonModel __result)
3524
{
36-
if (__instance.bloonsByName == null || __instance.bloonsByName.ContainsKey(id))
25+
if (__instance.bloons == null || __instance.bloons.Any(a => a.id == id))
3726
return true;
3827

3928
string newId = id.Replace("Regrow", "").Replace("Camo", "").Replace("Fortified", "");
40-
if (__instance.bloonsByName.TryGetValue(newId, out var value))
29+
var bloon = __instance.bloons.FirstOrDefault(a => a.id == newId);
30+
if (bloon != null)
31+
{
32+
__result = bloon;
33+
if (__result == null)
34+
MelonLogger.Msg("its null tho");
35+
return false;
36+
}
37+
38+
if (__instance.bloons.Any(b => b.id.Contains(id)))
4139
{
42-
__result = value;
40+
__result = __instance.bloons.First(b => b.id.Contains(id));
4341
return false;
4442
}
4543

4644
return true;
4745
}
4846
}
47+
[HarmonyPatch(typeof(BloonMenu), nameof(BloonMenu.CreateBloonButtons))]
48+
public static class BloonMenu_CreateBloonButtons_Patch
49+
{
50+
const string name = "BLOONFACTORYBLOONSPAWNER";
51+
52+
[HarmonyPrefix]
53+
private static void Prefix(BloonMenu __instance, ref List<BloonModel> sortedBloons)
54+
{
55+
sortedBloons = sortedBloons.Where(b => !CustomBloon.Bloons.Any(a => a.BloonTemplate.TemplateId == b.id));
56+
}
57+
58+
[HarmonyPostfix]
59+
private static void Postfix(BloonMenu __instance)
60+
{
61+
foreach (GameObject child in __instance.bloonButtonContainer.GetChildren())
62+
{
63+
if (child.name == name)
64+
{
65+
GameObject.Destroy(child);
66+
}
67+
}
68+
69+
foreach (var bloon in CustomBloon.Bloons)
70+
{
71+
var obj = GameObject.Instantiate(__instance.spawnBloonButtonPrefab, __instance.bloonButtonContainer.transform);
72+
obj.name = name;
73+
obj.RemoveComponent<SpawnBloonButton>();
74+
75+
BloonModel model = InGame.instance.bridge.Model.GetBloon(bloon.BloonTemplate.TemplateId);
76+
77+
obj.transform.FindChild("Icon").GetComponent<Image>().SetSprite(model.icon);
78+
79+
obj.GetComponent<Button>().AddOnClick(() =>
80+
{
81+
int spacing = int.Parse(__instance.bloonRate.text);
82+
int count = int.Parse(__instance.bloonCount.text);
83+
InGame.instance.bridge.SpawnBloons(InGame.instance.bridge.Model.CreateBloonEmissions(model, count, spacing * 5), 1, 0);
84+
});
85+
}
86+
}
87+
}
4988
}

ServerHandler.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,16 @@ internal static async Task<BloonTemplate> DownloadTemplate(Guid guid)
4141
response.EnsureSuccessStatusCode();
4242
byte[] bytes = await response.Content.ReadAsByteArrayAsync();
4343

44-
var obj = JsonConvert.DeserializeObject<BloonTemplate>(Encoding.UTF8.GetString(bytes), SerializationHandler.Settings);
45-
return obj;
44+
try
45+
{
46+
var obj = JsonConvert.DeserializeObject<BloonTemplate>(Encoding.UTF8.GetString(bytes), SerializationHandler.Settings);
47+
return obj;
48+
}
49+
catch (Exception ex)
50+
{
51+
MelonLogger.Msg(ex);
52+
return null;
53+
}
4654
}
4755
internal static async Task<(bool success, string errorCode)> UploadTemplate(BloonTemplate template, BloonCategory category, string description)
4856
{

0 commit comments

Comments
 (0)