11package github .kasuminova .novaeng .common .machine ;
22
33import crafttweaker .annotations .ZenRegister ;
4+ import crafttweaker .api .world .IBlockPos ;
45import github .kasuminova .mmce .common .event .client .ControllerGUIRenderEvent ;
56import github .kasuminova .mmce .common .event .machine .MachineStructureUpdateEvent ;
67import github .kasuminova .mmce .common .helper .IMachineController ;
8+ import github .kasuminova .novaeng .common .tile .TileDreamEnergyPort ;
79import github .kasuminova .novaeng .common .util .FixedSizeDeque ;
10+ import github .kasuminova .novaeng .common .util .IBlockPosEx ;
811import hellfirepvp .modularmachinery .ModularMachinery ;
912import hellfirepvp .modularmachinery .common .integration .crafttweaker .RecipeBuilder ;
1013import hellfirepvp .modularmachinery .common .integration .crafttweaker .RecipeModifierBuilder ;
2124import stanhebben .zenscript .annotations .ZenMethod ;
2225
2326import java .math .BigInteger ;
24- import java .util .HashMap ;
2527import java .util .Map ;
2628import 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 );
0 commit comments