-
Notifications
You must be signed in to change notification settings - Fork 37
/
VehicleUpgradeExample_BelowZero.cs
143 lines (126 loc) · 5.68 KB
/
VehicleUpgradeExample_BelowZero.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#if BELOWZERO
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using BepInEx;
using Nautilus.Assets;
using Nautilus.Assets.Gadgets;
using Nautilus.Assets.PrefabTemplates;
using Nautilus.Handlers;
using UnityEngine;
using UWE;
namespace Nautilus.Examples;
[BepInPlugin("com.snmodding.nautilus.vehicleupgrades", "Nautilus Vehicle Upgrades Example Mod", Nautilus.PluginInfo.PLUGIN_VERSION)]
public class VehicleUpgradeExample : BaseUnityPlugin
{
GameObject electricalDefensePrefab;
private void Awake()
{
var DefenseRecipe = new Crafting.RecipeData()
{
craftAmount = 1,
Ingredients = new List<Ingredient>()
{
new Ingredient(TechType.Polyaniline, 1),
new Ingredient(TechType.Quartz, 2),
new Ingredient(TechType.Battery, 2),
new Ingredient(TechType.AluminumOxide, 1)
}
};
Action<Hoverbike, int> onAdded = (Hoverbike instance, int slotID) =>
{
if (electricalDefensePrefab == null)
CoroutineHost.StartCoroutine(InitElectricalPrefab());
Subtitles.Add("Hoverbike perimeter defense upgrade module engaged.");
};
Action<Hoverbike, int> onRemoved = (Hoverbike instance, int slotID) =>
{
Subtitles.Add("Hoverbike perimeter defense upgrade module disengaged. Caution advised.");
};
Action<Hoverbike, int, float, float> onUsed = (Hoverbike instance, int slotID, float charge, float chargeScalar) =>
{
if (electricalDefensePrefab != null)
{
var electricalDefense = Utils.SpawnZeroedAt(electricalDefensePrefab, instance.transform, false).GetComponent<ElectricalDefense>();
electricalDefense.charge = charge;
electricalDefense.chargeScalar = chargeScalar;
}
else
{
CoroutineHost.StartCoroutine(InitElectricalPrefab());
Subtitles.Add("Hoverbike perimeter defense upgrade was not initialized. Initializing.");
}
};
/*
* Here we will make an Hoverbike module.
* This system is very easy to use but was complex enough to implement.
*/
var hoverbikePeriDefInfo = PrefabInfo.WithTechType(
"HoverbikePerimeterDefense",
"Hoverbike Perimeter Defense Module",
"A perimeter defense upgrade for the Hoverbike... No one knows if it will be useful.",
techTypeOwner: Assembly.GetExecutingAssembly())
.WithIcon(SpriteManager.Get(TechType.SeaTruckUpgradePerimeterDefense));
CustomPrefab hoverbikePeriDefPrefab = new CustomPrefab(hoverbikePeriDefInfo);
CloneTemplate seatruckPeriDefClone = new CloneTemplate(hoverbikePeriDefInfo, TechType.SeaTruckUpgradePerimeterDefense);
hoverbikePeriDefPrefab.SetGameObject(seatruckPeriDefClone);
hoverbikePeriDefPrefab.SetRecipe(DefenseRecipe)
.WithFabricatorType(CraftTree.Type.Fabricator)
.WithStepsToFabricatorTab("Machines")
.WithCraftingTime(2.5f);
hoverbikePeriDefPrefab.SetPdaGroupCategory(TechGroup.VehicleUpgrades, TechCategory.VehicleUpgrades);
hoverbikePeriDefPrefab.SetUnlock(TechType.Polyaniline);
hoverbikePeriDefPrefab.SetVehicleUpgradeModule(EquipmentType.HoverbikeModule, QuickSlotType.Chargeable)
.WithCooldown(5f)
.WithEnergyCost(5f)
.WithMaxCharge(10f)
.WithOnModuleAdded(onAdded)
.WithOnModuleRemoved(onRemoved)
.WithOnModuleUsed(onUsed);
hoverbikePeriDefPrefab.Register();
/*
* Now let's make one that can be selected and charged.
*/
var hoverbikeSelectDef = PrefabInfo.WithTechType("HoverbikeSelectDefense",
"Hoverbike Selectable Perimeter Defense Module",
"The same than the other module, but selectable.")
.WithIcon(SpriteManager.Get(TechType.SeaTruckUpgradePerimeterDefense));
var hoverbikeSelDefPrefab = new CustomPrefab(hoverbikeSelectDef);
hoverbikeSelDefPrefab.SetGameObject(seatruckPeriDefClone);
hoverbikeSelDefPrefab.SetPdaGroupCategory(TechGroup.VehicleUpgrades, TechCategory.VehicleUpgrades)
.WithCompoundTechsForUnlock(new()
{
TechType.Polyaniline
});
hoverbikeSelDefPrefab.SetRecipe(DefenseRecipe)
.WithFabricatorType(CraftTree.Type.Fabricator)
.WithStepsToFabricatorTab("Machines")
.WithCraftingTime(2.5f);
hoverbikeSelDefPrefab.SetVehicleUpgradeModule(EquipmentType.HoverbikeModule, QuickSlotType.SelectableChargeable)
.WithCooldown(5f)
.WithEnergyCost(5f)
.WithMaxCharge(10f)
.WithOnModuleAdded(onAdded)
.WithOnModuleRemoved(onRemoved)
.WithOnModuleUsed(onUsed);
hoverbikeSelDefPrefab.Register();
}
internal IEnumerator InitElectricalPrefab()
{
/*
* This function is getting the ElectricalDefense prefab from the SeaTruckUpgrades.
* You can see that this monobehaviour is not stored in the upgrade prefab.
*/
var task = CraftData.GetPrefabForTechTypeAsync(TechType.SeaTruck);
yield return task;
var result = task.GetResult();
var seatruckUpgrades = result.GetComponent<SeaTruckUpgrades>();
electricalDefensePrefab = seatruckUpgrades.electricalDefensePrefab;
Subtitles.Add("Hoverbike perimeter defense upgrade is initialized.");
}
}
#endif