Skip to content

Commit a5ae48e

Browse files
author
Circulate233
committed
半成品的梦之能量核心专用通量端口
1 parent 923fe1b commit a5ae48e

File tree

11 files changed

+319
-28
lines changed

11 files changed

+319
-28
lines changed

build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ plugins {
1313

1414
// Project properties
1515
group = "github.kasuminova.novaeng"
16-
version = "1.22.2"
16+
version = "1.22.3"
1717

1818
// Set the toolchain version to decouple the Java we run Gradle with from the Java used to compile and run the mod
1919
java {
@@ -295,6 +295,7 @@ dependencies {
295295
implementation(rfg.deobf("curse.maven:nuclearcraft-overhauled-336895:6160826"))
296296
implementation(rfg.deobf("curse.maven:Loot-Overhaul-299389:2711740"))
297297
implementation(rfg.deobf("curse.maven:BloodMagic-224791:2822288"))
298+
implementation(rfg.deobf("curse.maven:Flux-Networks-248020:3178199"))
298299
implementation(kotlin("stdlib-jdk8"))
299300
}
300301

src/main/java/github/kasuminova/novaeng/client/util/TitleUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class TitleUtils {
1313
/**
1414
* TODO 喜欢我硬编码吗.jpg
1515
*/
16-
public static final String DEFAULT_TITLE = "Nova Engineering: World 1.18.1 by Hikari_Nova | Core Ver: " + NovaEngineeringCore.VERSION;
16+
public static final String DEFAULT_TITLE = "Nova Engineering: World 1.18.2 by Hikari_Nova | Core Ver: " + NovaEngineeringCore.VERSION;
1717
public static final String VANILLA_TITLE = "Minecraft 1.12.2";
1818

1919
public static String currentTitle = null;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package github.kasuminova.novaeng.common.block;
2+
3+
import github.kasuminova.novaeng.common.tile.TileDreamEnergyPort;
4+
import net.minecraft.block.state.IBlockState;
5+
import net.minecraft.tileentity.TileEntity;
6+
import net.minecraft.world.World;
7+
import sonar.fluxnetworks.common.block.BlockFluxStorage;
8+
9+
import javax.annotation.Nullable;
10+
11+
public class BlockDreamEnergyPort extends BlockFluxStorage {
12+
public static final BlockDreamEnergyPort INSTANCE = new BlockDreamEnergyPort();
13+
14+
public BlockDreamEnergyPort() {
15+
super("DreamEnergyPort");
16+
}
17+
18+
@Nullable
19+
public TileEntity createTileEntity(World world, IBlockState state) {
20+
return new TileDreamEnergyPort();
21+
}
22+
23+
public int getMaxStorage() {
24+
return Integer.MAX_VALUE;
25+
}
26+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package github.kasuminova.novaeng.common.handler;
2+
3+
import github.kasuminova.novaeng.common.machine.DreamEnergyCore;
4+
import github.kasuminova.novaeng.common.tile.TileDreamEnergyPort;
5+
import hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController;
6+
import net.minecraft.util.EnumFacing;
7+
import net.minecraft.util.math.BlockPos;
8+
import net.minecraft.world.World;
9+
import sonar.fluxnetworks.common.connection.transfer.BasicTransferHandler;
10+
import sonar.fluxnetworks.common.tileentity.TileFluxStorage;
11+
12+
public class DreamEnergyPortHandler extends BasicTransferHandler<TileDreamEnergyPort> {
13+
private long added;
14+
private long removed;
15+
private BlockPos ctrlPos;
16+
private World world;
17+
18+
public DreamEnergyPortHandler(TileDreamEnergyPort device) {
19+
super(device);
20+
this.ctrlPos = device.getCtrlPos();
21+
this.world = device.getWorld();
22+
}
23+
24+
public void setWorld(World world) {
25+
this.world = world;
26+
}
27+
28+
public void setCtrlPos(BlockPos ctrlPos) {
29+
this.ctrlPos = ctrlPos;
30+
}
31+
32+
@Override
33+
public void onCycleStart() {
34+
35+
}
36+
37+
@Override
38+
public void onCycleEnd() {
39+
this.change = this.added - this.removed;
40+
this.added = 0L;
41+
this.removed = 0L;
42+
}
43+
44+
@Override
45+
public void updateTransfers(EnumFacing... enumFacings) {
46+
47+
}
48+
49+
public void addToBuffer(long energy) {
50+
if (energy > 0L) {
51+
DreamEnergyCore.receiveEnergy(getCtrl(),1,energy);
52+
this.added += energy;
53+
((TileFluxStorage)this.device).markServerEnergyChanged();
54+
}
55+
}
56+
57+
public long removeFromBuffer(long energy) {
58+
long a = Math.min(Math.min(energy, this.getBuffer()), ((TileFluxStorage)this.device).getLogicLimit() - this.removed);
59+
if (a <= 0L) {
60+
return 0L;
61+
} else {
62+
DreamEnergyCore.extractEnergy(getCtrl(),1,energy);
63+
this.removed += a;
64+
((TileFluxStorage)this.device).markServerEnergyChanged();
65+
return a;
66+
}
67+
}
68+
69+
@Override
70+
public long getRequest() {
71+
if (!getCtrlStructureFormed()){
72+
return 0;
73+
}
74+
return Long.MAX_VALUE;
75+
}
76+
77+
public TileMultiblockMachineController getCtrl(){
78+
if (ctrlPos == null){
79+
return null;
80+
}
81+
if (this.world.getTileEntity(ctrlPos) instanceof TileMultiblockMachineController ctrl) {
82+
if (ctrl.getFoundMachine() != null && ctrl.getFoundMachine().getRegistryName().equals(DreamEnergyCore.REGISTRY_NAME)){
83+
return ctrl;
84+
}
85+
}
86+
return null;
87+
}
88+
89+
public boolean getCtrlStructureFormed(){
90+
var ctrl = getCtrl();
91+
if (ctrl != null) {
92+
return ctrl.isStructureFormed();
93+
}
94+
return false;
95+
}
96+
}

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

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package github.kasuminova.novaeng.common.machine;
22

33
import crafttweaker.annotations.ZenRegister;
4+
import crafttweaker.api.world.IBlockPos;
45
import github.kasuminova.mmce.common.event.client.ControllerGUIRenderEvent;
56
import github.kasuminova.mmce.common.event.machine.MachineStructureUpdateEvent;
67
import github.kasuminova.mmce.common.helper.IMachineController;
8+
import github.kasuminova.novaeng.common.tile.TileDreamEnergyPort;
79
import github.kasuminova.novaeng.common.util.FixedSizeDeque;
10+
import github.kasuminova.novaeng.common.util.IBlockPosEx;
811
import hellfirepvp.modularmachinery.ModularMachinery;
912
import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeBuilder;
1013
import hellfirepvp.modularmachinery.common.integration.crafttweaker.RecipeModifierBuilder;
@@ -21,7 +24,6 @@
2124
import stanhebben.zenscript.annotations.ZenMethod;
2225

2326
import java.math.BigInteger;
24-
import java.util.HashMap;
2527
import java.util.Map;
2628
import java.util.concurrent.ConcurrentHashMap;
2729

@@ -34,8 +36,7 @@ public class DreamEnergyCore implements MachineSpecial{
3436
public static final ResourceLocation REGISTRY_NAME = new ResourceLocation(ModularMachinery.MODID, MachineID);
3537
public static final DreamEnergyCore INSTANCE = new DreamEnergyCore();
3638
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+
private static final Map<String, BigInteger> ENERGY_STORED_CACHE = new ConcurrentHashMap<>();
3940

4041
private static final int MinuteScale = 30;
4142
//最小传输速度,按倍计。
@@ -45,6 +46,13 @@ public class DreamEnergyCore implements MachineSpecial{
4546
//基础输入输出速度。能量输入输出速度计算方法为:defaultTransferAmount * speed,其中 speed 可由玩家控制。
4647
private static long defaultTransferAmount = 100000000;
4748

49+
private static IBlockPos facePos;
50+
51+
@ZenMethod
52+
public static void setFacePos(IBlockPos facePos) {
53+
DreamEnergyCore.facePos = facePos;
54+
}
55+
4856
@ZenMethod
4957
public static long setDefaultTransferAmount(long varue){
5058
defaultTransferAmount = varue;
@@ -89,8 +97,15 @@ public void init(DynamicMachine machine) {
8997

9098
public void SInit(DynamicMachine machine){
9199
machine.addMachineEventHandler(MachineStructureUpdateEvent.class, event -> {
92-
TileMultiblockMachineController controller = event.getController();
93-
controller.setWorkMode(TileMultiblockMachineController.WorkMode.SEMI_SYNC);
100+
TileMultiblockMachineController ctrl = event.getController();
101+
ctrl.setWorkMode(TileMultiblockMachineController.WorkMode.SEMI_SYNC);
102+
BlockPos facePos = ctrl.getPos().up();
103+
if (DreamEnergyCore.facePos != null){
104+
facePos = IBlockPosEx.createPosByFacing(ctrl.getPos(),ctrl.getControllerRotation(), DreamEnergyCore.facePos.getX(), DreamEnergyCore.facePos.getY(), DreamEnergyCore.facePos.getZ());
105+
}
106+
if (ctrl.getWorld().getTileEntity(facePos) instanceof TileDreamEnergyPort tdep){
107+
tdep.setCtrlPos(ctrl.getPos());
108+
}
94109
});
95110
var inputThreadName = "梦之收集者";
96111
machine.addCoreThread(FactoryRecipeThread.createCoreThread(inputThreadName));
@@ -117,7 +132,6 @@ public void SInit(DynamicMachine machine){
117132
})
118133
.addFactoryFinishHandler(event -> {
119134
var ctrl = event.getController();
120-
var thread = event.getFactoryRecipeThread();
121135
var data = ctrl.getCustomDataTag();
122136
var speed = Math.max(1.0f,data.getFloat("speed"));
123137
extractEnergy(data, speed, defaultTransferAmount);
@@ -145,10 +159,9 @@ public void SInit(DynamicMachine machine){
145159
})
146160
.addFactoryPostTickHandler(event -> {
147161
var ctrl = event.getController();
148-
var thread = event.getFactoryRecipeThread();
149162
var data = ctrl.getCustomDataTag();
150163
var speed = Math.max(1.0f,data.getFloat("speed"));
151-
receiveEnergy(data, speed);
164+
receiveEnergy(data, speed,defaultTransferAmount);
152165
})
153166
.setParallelized(false)
154167
.addRecipeTooltip("由梦之释放者运行。", "在智能数据接口处修改速度。")
@@ -182,11 +195,11 @@ public void CInit(DynamicMachine machine){
182195
*/
183196
private static boolean canExtract(NBTTagCompound nbt,float speed){
184197
if (nbt.hasKey("energyStored")) {
185-
var energyStored = getBigInt(nbt.getString("energyStored"));
198+
var energyStored = getEnergyStored(nbt);
186199
var sz = (long) (speed * defaultTransferAmount);
187200
if (energyStored.compareTo(BigLongMax) >= 0) {
188-
if (ENERGY_STORED_CACHE.get().size() > 800) {
189-
ENERGY_STORED_CACHE.get().clear();
201+
if (ENERGY_STORED_CACHE.size() > 3000) {
202+
ENERGY_STORED_CACHE.clear();
190203
}
191204
return true;
192205
}
@@ -198,29 +211,48 @@ private static boolean canExtract(NBTTagCompound nbt,float speed){
198211
/**
199212
* 将能量存储进控制器内部。
200213
*/
201-
private static void receiveEnergy(NBTTagCompound nbt,float speed) {
202-
var energyStored = nbt.hasKey("energyStored") ? getBigInt(nbt.getString("energyStored")) : BigInteger.ZERO;
214+
private static void receiveEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
215+
var energyStored = getEnergyStored(nbt);
203216
var sz = BigInteger.valueOf((long) (speed * defaultTransferAmount));
204217

205218
nbt.setString("energyStored",energyStored.add(sz).toString());
206-
if (ENERGY_STORED_CACHE.get().size() > 800) {
207-
ENERGY_STORED_CACHE.get().clear();
219+
if (ENERGY_STORED_CACHE.size() > 3000) {
220+
ENERGY_STORED_CACHE.clear();
208221
}
209222
}
210223

211224
/**
212225
* 提取控制器内部能量至能量输出仓。
213226
*/
214227
private static void extractEnergy(NBTTagCompound nbt,float speed,long defaultTransferAmount) {
215-
var energyStored = nbt.hasKey("energyStored") ? getBigInt(nbt.getString("energyStored")) : BigInteger.ZERO;
228+
var energyStored = getEnergyStored(nbt);
216229
var sz = BigInteger.valueOf((long) (speed * defaultTransferAmount));
217230

218231
nbt.setString("energyStored",energyStored.subtract(sz).toString());
219-
if (ENERGY_STORED_CACHE.get().size() > 800) {
220-
ENERGY_STORED_CACHE.get().clear();
232+
if (ENERGY_STORED_CACHE.size() > 3000) {
233+
ENERGY_STORED_CACHE.clear();
221234
}
222235
}
223236

237+
public static BigInteger getEnergyStored(NBTTagCompound nbt){
238+
return nbt.hasKey("energyStored") ? getBigInt(nbt.getString("energyStored")) : BigInteger.ZERO;
239+
}
240+
241+
public static BigInteger getEnergyStored(IMachineController ctrl){
242+
return getEnergyStored(ctrl.getController().getCustomDataTag());
243+
}
244+
245+
/**
246+
* 额外的crt方法复用方法作为能量输入方法
247+
* @param ctrl 控制器
248+
* @param speed 倍率
249+
* @param amount 每倍率消耗
250+
*/
251+
@ZenMethod
252+
public static void receiveEnergy(IMachineController ctrl,float speed,long amount){
253+
receiveEnergy(ctrl.getController().getCustomDataTag(),speed,amount);
254+
}
255+
224256
/**
225257
* 额外的crt方法复用方法作为能量消耗方法
226258
* @param ctrl 控制器
@@ -234,7 +266,7 @@ public static void extractEnergy(IMachineController ctrl,float speed,long amount
234266

235267
@ZenMethod
236268
public static BigInteger getBigInt(String num){
237-
return ENERGY_STORED_CACHE.get().computeIfAbsent(num, BigInteger::new);
269+
return ENERGY_STORED_CACHE.computeIfAbsent(num, BigInteger::new);
238270
}
239271

240272
private static final String longmax = Long.toString(Long.MAX_VALUE);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import github.kasuminova.novaeng.common.item.ecalculator.*;
1111
import github.kasuminova.novaeng.common.item.efabriactor.*;
1212
import github.kasuminova.novaeng.common.item.estorage.ItemEStorageController;
13+
import github.kasuminova.novaeng.common.tile.TileDreamEnergyPort;
1314
import github.kasuminova.novaeng.common.tile.TileHyperNetTerminal;
1415
import github.kasuminova.novaeng.common.tile.TileModularServerAssembler;
1516
import github.kasuminova.novaeng.common.tile.ecotech.ecalculator.*;
@@ -65,6 +66,7 @@ public static void registerBlocks() {
6566
prepareItemBlockRegister(registerBlock(BlockSingularityCoreController.INSTANCE));
6667
prepareItemBlockRegister(registerBlock(BlockGeocentricDrillController.INSTANCE));
6768
prepareItemBlockRegister(registerBlock(BlockRedstoneLogicalPort.INSTANCE));
69+
prepareItemBlockRegister(registerBlock(BlockDreamEnergyPort.INSTANCE));
6870

6971
// EStorage
7072
prepareItemBlockRegister(new ItemEStorageController(registerBlock(BlockEStorageController.L4)));
@@ -122,6 +124,7 @@ public static void registerTileEntities() {
122124
registerTileEntity(TileModularServerAssembler.class, "modular_server_assembler");
123125
registerTileEntity(SingularityCore.class, "singularity_core");
124126
registerTileEntity(GeocentricDrillController.class, "geocentric_drill_controller");
127+
registerTileEntity(TileDreamEnergyPort.class,"dream_energy_port");
125128

126129
// EStorage
127130
registerTileEntity(EStorageController.class, "estorage_controller");

0 commit comments

Comments
 (0)