Skip to content

Commit e0c2b3d

Browse files
author
Circulate233
committed
一些修正
1 parent bff3f29 commit e0c2b3d

File tree

5 files changed

+178
-28
lines changed

5 files changed

+178
-28
lines changed

src/main/java/github/kasuminova/novaeng/common/CommonProxy.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@ public void init() {
8484
new ResourceLocation(ModularMachinery.MODID, "hypernet_terminal"),
8585
HyperNetTerminal.class
8686
);
87-
88-
IntegrationTOP.registerProvider();
87+
if (Loader.isModLoaded("theoneprobe")) IntegrationTOP.registerProvider();
8988
RecipeAdapterExtended.registerAdapter();
9089
AssemblyLine.registerNetNode();
9190
HyperNetRecipeManager.registerRecipes();

src/main/java/github/kasuminova/novaeng/common/crafttweaker/util/NovaEngUtils.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,27 +59,15 @@ public static String formatNumber(long value) {
5959

6060
@ZenMethod
6161
public static String formatNumber(String value) {
62-
var BigValue = new BigInteger(value);
63-
var big = BigValue.compareTo(BigLongMax) >= 0 ? Long.MAX_VALUE : BigValue.longValue();
62+
var BigValue = new BigInteger(value).abs();
63+
long big = BigValue.compareTo(BigLongMax) >= 0 ? Long.MAX_VALUE : BigValue.longValue();
6464
String zf = "";
6565
if (value.startsWith("-")){
6666
zf += "-";
6767
}
68-
if (big < 1000) {
69-
return zf + value;
70-
} else if (big < 1000000) {
71-
return zf + (big / 1000) + "K";
72-
} else if (big < 1000000000) {
73-
return zf + ((big / 1000)/ 1000) + "M";
74-
} else if (big < 1000000000000L) {
75-
return zf + ((big / 1000000)/ 1000) + "G";
76-
} else if (big < 1000000000000000L) {
77-
return zf + ((big / 1000000000)/ 1000) + "T";
78-
} else if (big < 1000000000000000000L) {
79-
return zf + ((big / 1_000_000_000_000L)/ 1000) + "P";
80-
} else if (big != (Long.MAX_VALUE)){
81-
return zf + ((big / 1_000_000_000_000_000L)/ 1000) + "E";
82-
} else {
68+
if (big != (Long.MAX_VALUE)){
69+
return formatNumber(big,1);
70+
} else {
8371
int cfs = value.length() - 1;
8472
float cft = (1.00f * Integer.parseInt(value.substring(0,3))) / 100;
8573

src/main/java/github/kasuminova/novaeng/common/machine/DreamEnergyCore.java

Lines changed: 168 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,16 @@
22

33
import crafttweaker.annotations.ZenRegister;
44
import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent;
5+
import github.kasuminova.mmce.common.event.machine.MachineStructureUpdateEvent;
6+
import github.kasuminova.mmce.common.helper.IMachineController;
57
import github.kasuminova.novaeng.common.util.FixedSizeDeque;
68
import hellfirepvp.modularmachinery.ModularMachinery;
9+
import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeBuilder;
10+
import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeModifierBuilder;
711
import hellfirepvp.modularmachinery.common.machine.DynamicMachine;
12+
import hellfirepvp.modularmachinery.common.machine.factory.FactoryRecipeThread;
813
import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController;
14+
import net.minecraft.nbt.NBTTagCompound;
915
import net.minecraft.util.ResourceLocation;
1016
import net.minecraft.util.math.BlockPos;
1117
import net.minecraft.world.World;
@@ -15,6 +21,7 @@
1521
import stanhebben.zenscript.annotations.ZenMethod;
1622

1723
import java.math.BigInteger;
24+
import java.util.HashMap;
1825
import java.util.Map;
1926
import java.util.concurrent.ConcurrentHashMap;
2027

@@ -23,18 +30,39 @@
2330
@ZenRegister
2431
@ZenClass("novaeng.DreamEnergyCore")
2532
public class DreamEnergyCore implements MachineSpecial{
26-
public static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, "dream_energy_core");
33+
private static final String MachineID = "dream_energy_core";
34+
private static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, MachineID);
2735
public static final DreamEnergyCore INSTANCE = new DreamEnergyCore();
28-
public static long defaultTransferAmount = 10000000;
2936
private static final Map<World,Map<BlockPos, FixedSizeDeque<String>>> map = new ConcurrentHashMap<>();
37+
private static final ThreadLocal<Map<String, BigInteger>> ENERGY_STORED_CACHE =
38+
ThreadLocal.withInitial(HashMap::new);
39+
3040
private static final int MinuteScale = 30;
41+
//最小传输速度,按倍计。
42+
private static float minSpeed = 0.01f;
43+
//最大传输速度,按倍计。
44+
private static int maxSpeed = 40000;
45+
//基础输入输出速度。能量输入输出速度计算方法为:defaultTransferAmount * speed,其中 speed 可由玩家控制。
46+
private static long defaultTransferAmount = 10000000;
3147

3248
@ZenMethod
33-
public static long setDefaultTransferAmount(long value){
34-
defaultTransferAmount = value;
49+
public static long setDefaultTransferAmount(long varue){
50+
defaultTransferAmount = varue;
3551
return defaultTransferAmount;
3652
}
3753

54+
@ZenMethod
55+
public static float setMinSpeed(float varue){
56+
minSpeed = varue;
57+
return minSpeed;
58+
}
59+
60+
@ZenMethod
61+
public static int setMaxSpeed(int varue){
62+
maxSpeed = varue;
63+
return maxSpeed;
64+
}
65+
3866
@Override
3967
public ResourceLocation getRegistryName() {
4068
return REGISTRY_NAME;
@@ -53,11 +81,82 @@ public void onClientTick(final TileMultiblockMachineController ctrl) {
5381

5482
@Override
5583
public void init(DynamicMachine machine) {
84+
SInit(machine);
5685
if (isClient) {
5786
CInit(machine);
5887
}
5988
}
6089

90+
public void SInit(DynamicMachine machine){
91+
machine.addMachineEventHandler(MachineStructureUpdateEvent.class, event -> {
92+
TileMultiblockMachineController controller = event.getController();
93+
controller.setWorkMode(TileMultiblockMachineController.WorkMode.SEMI_SYNC);
94+
});
95+
var inputThreadName = "梦之收集者";
96+
machine.addCoreThread(FactoryRecipeThread.createCoreThread(inputThreadName));
97+
var outputThreadName = "梦之释放者";
98+
machine.addCoreThread(FactoryRecipeThread.createCoreThread(outputThreadName));
99+
var fairyCraftingThreadName = "梦之同步者";
100+
machine.addCoreThread(FactoryRecipeThread.createCoreThread(fairyCraftingThreadName));
101+
var manaCraftingThreadName = "梦之聚合者";
102+
machine.addCoreThread(FactoryRecipeThread.createCoreThread(manaCraftingThreadName));
103+
104+
// 输出配方
105+
RecipeBuilder.newBuilder("extract", MachineID, 1, 1, true)
106+
.addEnergyPerTickOutput(defaultTransferAmount)
107+
.addPreCheckHandler(event -> {
108+
var ctrl = event.getController();
109+
var data = ctrl.getCustomDataTag();
110+
var speed = Math.max(1.0f,data.getFloat("speed"));
111+
var energy = data.hasKey("energyStored") ? "0" : data.getString("energyStored");
112+
if (!canExtract(data, speed)) {
113+
event.setFailed("内部能量储量不足!");
114+
return;
115+
}
116+
ctrl.addPermanentModifier("extract", RecipeModifierBuilder.create("modularmachinery:energy", "output", speed, 1, false).build());
117+
})
118+
.addFactoryFinishHandler(event -> {
119+
var ctrl = event.getController();
120+
var thread = event.getFactoryRecipeThread();
121+
var data = ctrl.getCustomDataTag();
122+
var speed = Math.max(1.0f,data.getFloat("speed"));
123+
extractEnergy(data, speed, defaultTransferAmount);
124+
})
125+
.setParallelized(false)
126+
.addRecipeTooltip("由梦之收集者运行。", "在智能数据接口处修改速度。")
127+
.addSmartInterfaceDataInput("speed", minSpeed, maxSpeed)
128+
.setThreadName(outputThreadName)
129+
.build();
130+
131+
// 输入配方
132+
RecipeBuilder.newBuilder("receive", MachineID, 1, 2, true)
133+
.addEnergyPerTickInput(defaultTransferAmount)
134+
.addFactoryPreTickHandler(event -> {
135+
var ctrl = event.getController();
136+
var data = ctrl.getCustomDataTag();
137+
var speed = Math.max(1.0f,data.getFloat("speed"));
138+
ctrl.addPermanentModifier("receive", RecipeModifierBuilder.create("modularmachinery:energy", "input", speed, 1, false).build());
139+
})
140+
.addPreCheckHandler(event -> {
141+
var ctrl = event.getController();
142+
var data = ctrl.getCustomDataTag();
143+
var speed = Math.max(1.0f,data.getFloat("speed"));
144+
ctrl.addPermanentModifier("receive", RecipeModifierBuilder.create("modularmachinery:energy", "input", speed, 1, false).build());
145+
})
146+
.addFactoryPostTickHandler(event -> {
147+
var ctrl = event.getController();
148+
var thread = event.getFactoryRecipeThread();
149+
var data = ctrl.getCustomDataTag();
150+
var speed = Math.max(1.0f,data.getFloat("speed"));
151+
receiveEnergy(data, speed);
152+
})
153+
.setParallelized(false)
154+
.addRecipeTooltip("由梦之释放者运行。", "在智能数据接口处修改速度。")
155+
.addSmartInterfaceDataInput("speed", minSpeed, maxSpeed)
156+
.setThreadName(inputThreadName)
157+
.build();
158+
}
159+
61160
@SideOnly(Side.CLIENT)
62161
public void CInit(DynamicMachine machine){
63162
machine.addMachineEventHandler(ControllerGUIRenderEvent.class, event -> {
@@ -78,15 +177,77 @@ public void CInit(DynamicMachine machine){
78177
});
79178
}
80179

180+
/**
181+
* 能否提取能量。
182+
*/
183+
private static boolean canExtract(NBTTagCompound nbt,float speed){
184+
if (nbt.hasKey("energyStored")) {
185+
var energyStored = getBigInt(nbt.getString("energyStored"));
186+
var sz = (long) (speed * defaultTransferAmount);
187+
if (energyStored.compareTo(BigLongMax) >= 0) {
188+
if (ENERGY_STORED_CACHE.get().size() > 800) {
189+
ENERGY_STORED_CACHE.get().clear();
190+
}
191+
return true;
192+
}
193+
return energyStored.longValue() >= sz;
194+
}
195+
return false;
196+
}
197+
198+
/**
199+
* 将能量存储进控制器内部。
200+
*/
201+
private static void receiveEnergy(NBTTagCompound nbt,float speed) {
202+
var energyStored = nbt.hasKey("energyStored") ? getBigInt(nbt.getString("energyStored")) : BigInteger.ZERO;
203+
var sz = BigInteger.valueOf((long) (speed * defaultTransferAmount));
204+
205+
nbt.setString("energyStored",energyStored.add(sz).toString());
206+
if (ENERGY_STORED_CACHE.get().size() > 800) {
207+
ENERGY_STORED_CACHE.get().clear();
208+
}
209+
}
210+
211+
/**
212+
* 提取控制器内部能量至能量输出仓。
213+
*/
214+
private static void extractEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
215+
var energyStored = nbt.hasKey("energyStored") ? getBigInt(nbt.getString("energyStored")) : BigInteger.ZERO;
216+
var sz = BigInteger.valueOf((long) (speed * defaultTransferAmount));
217+
218+
nbt.setString("energyStored",energyStored.subtract(sz).toString());
219+
if (ENERGY_STORED_CACHE.get().size() > 800) {
220+
ENERGY_STORED_CACHE.get().clear();
221+
}
222+
}
223+
224+
/**
225+
* 额外的crt方法复用方法作为能量消耗方法
226+
* @param ctrl 控制器
227+
* @param speed 倍率
228+
* @param amount 每倍率消耗
229+
*/
230+
@ZenMethod
231+
public static void extractEnergy(IMachineController ctrl,float speed,long amount){
232+
extractEnergy(ctrl.getController().getCustomDataTag(),speed,amount);
233+
}
234+
235+
@ZenMethod
236+
public static BigInteger getBigInt(String num){
237+
return ENERGY_STORED_CACHE.get().computeIfAbsent(num, BigInteger::new);
238+
}
239+
240+
private static final String longmax = Long.toString(Long.MAX_VALUE);
241+
81242
private String change(TileMultiblockMachineController ctrl){
82243
FixedSizeDeque<String> energy = getEnergyInfo(ctrl.getWorld(),ctrl.getPos());
83244
var newtime = energy.getFirst();
84245
var oldtime = energy.getLast();
85-
var newbig = new BigInteger(newtime);
86-
var oldbig = new BigInteger(oldtime);
246+
var newbig = getBigInt(newtime);
247+
var oldbig = getBigInt(oldtime);
87248
var changel = newbig.subtract(oldbig);
88249

89-
return formatNumber(changel.compareTo(BigLongMax) >= 0 ? Long.MAX_VALUE : changel.longValue() / (1200L / MinuteScale * energy.size()));
250+
return formatNumber(changel.compareTo(BigLongMax) >= 0 ? longmax : Long.toString(changel.longValue() / (1200L / MinuteScale * energy.size())));
90251
}
91252

92253
private static FixedSizeDeque<String> getEnergyInfo(World world,BlockPos pos) {

src/main/java/github/kasuminova/novaeng/common/registry/RegistryItems.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ public void registerItems(RegistryEvent.Register<Item> event) {
5555
ITEMS_TO_REGISTER.add(ECalculatorCell.L4);
5656
ITEMS_TO_REGISTER.add(ECalculatorCell.L6);
5757
ITEMS_TO_REGISTER.add(ECalculatorCell.L9);
58-
ITEMS_TO_REGISTER.add(ItemHorologiumCompass.INSTANCE);
58+
if (Mods.ASTRAL_SORCERY.isPresent()) {
59+
ITEMS_TO_REGISTER.add(ItemHorologiumCompass.INSTANCE);
60+
}
5961

6062
ITEMS_TO_REGISTER.addAll(ItemBasic.getAllItem());
6163

src/main/java/github/kasuminova/novaeng/common/util/IBlockPosEx.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static IBlockPos createPosByFacing(IBlockPos instance,IFacing facing,int
2323
case WEST -> new MCBlockPos(z,y,-x);
2424
case UP -> new MCBlockPos(x,-z,y);
2525
case DOWN -> new MCBlockPos(x,z,y);
26-
default -> instance;
26+
case NORTH -> new MCBlockPos(x,y,z);
2727
};
2828
}
2929

0 commit comments

Comments
 (0)