mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
Merge branch 'master' into moige
This commit is contained in:
commit
4fb7df8b3e
47
.github/workflows/build.yml
vendored
Normal file
47
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
# This workflow uses actions that are not certified by GitHub.
|
||||
# They are provided by a third-party and are governed by
|
||||
# separate terms of service, privacy policy, and support
|
||||
# documentation.
|
||||
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
|
||||
|
||||
# Yes this is a mostly untouched Github actions template
|
||||
|
||||
name: Java CI with Gradle
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
pull_request:
|
||||
branches: [ "master" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'temurin' # Temurin because it's default :P
|
||||
|
||||
# Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
|
||||
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0
|
||||
|
||||
- name: Build with Gradle Wrapper
|
||||
run: ./gradlew build
|
||||
|
||||
- name: Upload a Build Artifact
|
||||
uses: actions/upload-artifact@v4.6.0
|
||||
with:
|
||||
# A file, directory or wildcard pattern that describes what to upload
|
||||
path: ./build/libs
|
||||
|
||||
|
||||
26
changelog
26
changelog
@ -1,25 +1,7 @@
|
||||
## Added
|
||||
* Bauxite processing
|
||||
* Bauxite is now processed by mixing it with lye, and then fractioning it into sodium aluminate and red mud
|
||||
* Red mud can now be turned into cement
|
||||
* Sodium aluminate can either be processed directly into aluminium in a rotary furnace, or turned into alumina with fluorite to be used in an electrolyzer
|
||||
* Standard aluminium ore is now "aluminium-bearing ore" which drops cryolite, which can either be smelted into aluminium like normal or combination smelted into aluminium and lye
|
||||
* Particle accelerator
|
||||
* Should be about finished now
|
||||
* Recipes should now be doable
|
||||
* Added recipes to all the components
|
||||
* Changed the dipole mechanic from a momentum penalty to a power draw penalty for smaller accelerator rings
|
||||
* Added explicit compressor recipes for perfluoromethyl in order to change the standard compression speed of 100 ticks to 50
|
||||
* All the parts have tooltips, you'll figure it out
|
||||
|
||||
## Changed
|
||||
* Blast doors will now pulverize any block that gets in their way during closing
|
||||
* The nuclear and RTG furnaces will be retired, their recipes have been removed but they remain operational for now
|
||||
* Changed the magnetron recipe to be 3 copper plates and 4 tungsten wires
|
||||
* Added recipes to some secret ammo types
|
||||
* Particle detectors now print an error for when the recipe could not be completed
|
||||
|
||||
## Fixed
|
||||
* Fixed the CCGT's steam output breaking as soon as the steam buffer runs full
|
||||
* Fixed crash caused by mobs holding belt-fed guns
|
||||
* Fixed boiler heat input being way too low due to operation order (diffusion was applied AFTER the input heat was capped)
|
||||
* Fixed stinger playing its lockon sound on the wrong side
|
||||
* Fixed items being annihilated when shift clicking them into the particle source
|
||||
* Fixed packet optimization not allowing packets to be sent when the day night cycle is halted
|
||||
* Fixed particle detectors not always using power when they should
|
||||
@ -1,6 +1,6 @@
|
||||
mod_version=1.0.27
|
||||
# Empty build number makes a release type
|
||||
mod_build_number=5229
|
||||
mod_build_number=5230
|
||||
|
||||
credits=HbMinecraft,\
|
||||
\ rodolphito (explosion algorithms),\
|
||||
@ -39,6 +39,7 @@ credits=HbMinecraft,\
|
||||
\ Nos (models),\
|
||||
\ Minecreep (models),\
|
||||
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes, cryolite),\
|
||||
\ instantnootles (concept artist),\
|
||||
\ haru315 (spiral point algorithm),\
|
||||
\ Sten89 (models),\
|
||||
\ Pixelguru26 (textures),\
|
||||
|
||||
@ -89,7 +89,7 @@ public class ArmorRecipes {
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.fau_plate, 1), new Object[] { "MCM", "PBP", "PSP", 'M', ModItems.motor_desh, 'C', ModItems.demon_core_closed, 'P', ModItems.plate_armor_fau, 'B', ModItems.starmetal_plate, 'S', ModBlocks.ancient_scrap });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.fau_legs, 1), new Object[] { "MPM", "PBP", "PDP", 'M', ModItems.motor_desh, 'P', ModItems.plate_armor_fau, 'B', ModItems.starmetal_legs, 'D', ModItems.billet_polonium });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.fau_boots, 1), new Object[] { "PDP", "PBP", 'P', ModItems.plate_armor_fau, 'D', ModItems.billet_polonium, 'B', ModItems.starmetal_boots });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.dns_helmet, 1), new Object[] { "PCP", "PBP", "PSP", 'P', ModItems.plate_armor_dnt, 'S', ModItems.ingot_chainsteel, 'B', ModItems.bj_helmet, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BISMOID) });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.dns_helmet, 1), new Object[] { "PCP", "PBP", "PSP", 'P', ModItems.plate_armor_dnt, 'S', ModItems.ingot_chainsteel, 'B', ModItems.bj_helmet, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.QUANTUM) });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.dns_plate, 1), new Object[] { "PCP", "PBP", "PSP", 'P', ModItems.plate_armor_dnt, 'S', ModItems.ingot_chainsteel, 'B', ModItems.bj_plate_jetpack, 'C', ModItems.singularity_spark });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.dns_legs, 1), new Object[] { "PCP", "PBP", "PSP", 'P', ModItems.plate_armor_dnt, 'S', ModItems.ingot_chainsteel, 'B', ModItems.bj_legs, 'C', ModItems.coin_worm });
|
||||
CraftingManager.addRecipeAuto(new ItemStack(ModItems.dns_boots, 1), new Object[] { "PCP", "PBP", "PSP", 'P', ModItems.plate_armor_dnt, 'S', ModItems.ingot_chainsteel, 'B', ModItems.bj_boots, 'C', ModItems.demon_core_closed });
|
||||
|
||||
@ -10,10 +10,12 @@ import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingStep;
|
||||
import com.hbm.inventory.fluid.trait.FT_Heatable.HeatingType;
|
||||
import com.hbm.items.machine.ItemFluidIcon;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class BoilingHandler extends NEIUniversalHandler {
|
||||
|
||||
public BoilingHandler() {
|
||||
super(ModBlocks.machine_boiler.getLocalizedName(), ModBlocks.machine_boiler, generateRecipes());
|
||||
super(ModBlocks.machine_boiler.getLocalizedName(), new ItemStack[] { new ItemStack(ModBlocks.machine_boiler), new ItemStack(ModBlocks.machine_industrial_boiler) }, generateRecipes());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
27
src/main/java/com/hbm/handler/nei/DeuteriumHandler.java
Normal file
27
src/main/java/com/hbm/handler/nei/DeuteriumHandler.java
Normal file
@ -0,0 +1,27 @@
|
||||
package com.hbm.handler.nei;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.hbm.blocks.ModBlocks;
|
||||
import com.hbm.inventory.fluid.Fluids;
|
||||
import com.hbm.items.machine.ItemFluidIcon;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class DeuteriumHandler extends NEIUniversalHandler {
|
||||
|
||||
public DeuteriumHandler() {
|
||||
super(ModBlocks.machine_deuterium_extractor.getLocalizedName(), new ItemStack[] { new ItemStack(ModBlocks.machine_deuterium_extractor), new ItemStack(ModBlocks.machine_deuterium_tower) }, generateRecipes());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return "ntmDeuterium";
|
||||
}
|
||||
|
||||
public static HashMap<Object, Object> generateRecipes() {
|
||||
HashMap<Object, Object> map = new HashMap();
|
||||
map.put(ItemFluidIcon.make(Fluids.WATER, 1_000), ItemFluidIcon.make(Fluids.HEAVYWATER, 20));
|
||||
return map;
|
||||
}
|
||||
}
|
||||
338
src/main/java/com/hbm/inventory/container/ContainerNT.java
Normal file
338
src/main/java/com/hbm/inventory/container/ContainerNT.java
Normal file
@ -0,0 +1,338 @@
|
||||
package com.hbm.inventory.container;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.hbm.util.InventoryUtil;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public abstract class ContainerNT extends Container {
|
||||
|
||||
/**
|
||||
* Fix: mergeItemStack does not respect inventory or slot stack limitations.
|
||||
* We simply intercept the method and call InventoryUtil.mergeItemStack which
|
||||
* runs the same logic but respecting stack limits.
|
||||
*/
|
||||
@Override
|
||||
protected boolean mergeItemStack(ItemStack stack, int start, int end, boolean reverse) {
|
||||
return InventoryUtil.mergeItemStack(inventorySlots, stack, start, end, reverse);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix: the default behavior of transferStackInSlot simply crashes the game.
|
||||
* We intercept this part and return null, which means that by default, the
|
||||
* shift click function does nothing.
|
||||
*/
|
||||
@Override
|
||||
public ItemStack transferStackInSlot(EntityPlayer player, int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// fuck you mojang
|
||||
@Override
|
||||
public ItemStack slotClick(int index, int button, int mode, EntityPlayer player) {
|
||||
|
||||
/*
|
||||
* INDEX
|
||||
* -999: Mouse outside GUI
|
||||
* MODE
|
||||
* 2: Hotbar keys
|
||||
* 3: Duplicate item
|
||||
* 4: Drop item
|
||||
* 5: Drag
|
||||
*/
|
||||
|
||||
ItemStack returnStack = null;
|
||||
InventoryPlayer invPlayer = player.inventory;
|
||||
Slot slot = index >= 0 && index < this.inventorySlots.size() ? (Slot) this.inventorySlots.get(index) : null;
|
||||
|
||||
int i1;
|
||||
ItemStack itemstack3;
|
||||
|
||||
/// DRAG ///
|
||||
if(mode == 5) {
|
||||
int l = this.field_94536_g;
|
||||
this.field_94536_g = func_94532_c(button);
|
||||
|
||||
if((l != 1 || this.field_94536_g != 2) && l != this.field_94536_g) {
|
||||
this.func_94533_d();
|
||||
} else if(invPlayer.getItemStack() == null) {
|
||||
this.func_94533_d();
|
||||
} else if(this.field_94536_g == 0) {
|
||||
this.field_94535_f = func_94529_b(button);
|
||||
|
||||
if(func_94528_d(this.field_94535_f)) {
|
||||
this.field_94536_g = 1;
|
||||
this.field_94537_h.clear();
|
||||
} else {
|
||||
this.func_94533_d();
|
||||
}
|
||||
} else if(this.field_94536_g == 1) {
|
||||
|
||||
if(slot != null && func_94527_a(slot, invPlayer.getItemStack(), true) && slot.isItemValid(invPlayer.getItemStack())
|
||||
&& invPlayer.getItemStack().stackSize > this.field_94537_h.size() && this.canDragIntoSlot(slot)) {
|
||||
this.field_94537_h.add(slot);
|
||||
}
|
||||
} else if(this.field_94536_g == 2) {
|
||||
if(!this.field_94537_h.isEmpty()) {
|
||||
itemstack3 = invPlayer.getItemStack().copy();
|
||||
i1 = invPlayer.getItemStack().stackSize;
|
||||
Iterator iterator = this.field_94537_h.iterator();
|
||||
|
||||
while(iterator.hasNext()) {
|
||||
Slot slot1 = (Slot) iterator.next();
|
||||
|
||||
if(slot1 != null && func_94527_a(slot1, invPlayer.getItemStack(), true) && slot1.isItemValid(invPlayer.getItemStack())
|
||||
&& invPlayer.getItemStack().stackSize >= this.field_94537_h.size() && this.canDragIntoSlot(slot1)) {
|
||||
ItemStack stackCopy = itemstack3.copy();
|
||||
int j1 = slot1.getHasStack() ? slot1.getStack().stackSize : 0;
|
||||
func_94525_a(this.field_94537_h, this.field_94535_f, stackCopy, j1);
|
||||
|
||||
if(stackCopy.stackSize > stackCopy.getMaxStackSize()) {
|
||||
stackCopy.stackSize = stackCopy.getMaxStackSize();
|
||||
}
|
||||
|
||||
if(stackCopy.stackSize > slot1.getSlotStackLimit()) {
|
||||
stackCopy.stackSize = slot1.getSlotStackLimit();
|
||||
}
|
||||
|
||||
i1 -= stackCopy.stackSize - j1;
|
||||
slot1.putStack(stackCopy);
|
||||
}
|
||||
}
|
||||
|
||||
itemstack3.stackSize = i1;
|
||||
|
||||
if(itemstack3.stackSize <= 0) {
|
||||
itemstack3 = null;
|
||||
}
|
||||
|
||||
invPlayer.setItemStack(itemstack3);
|
||||
}
|
||||
|
||||
this.func_94533_d();
|
||||
} else {
|
||||
this.func_94533_d();
|
||||
}
|
||||
/// NOBODY KNOWS ///
|
||||
} else if(this.field_94536_g != 0) {
|
||||
this.func_94533_d();
|
||||
|
||||
/// NON-DRAG ///
|
||||
} else {
|
||||
|
||||
int l1;
|
||||
ItemStack itemstack5;
|
||||
|
||||
/// LMB/RMB ///
|
||||
if((mode == 0 || mode == 1) && (button == 0 || button == 1)) {
|
||||
if(index == -999) {
|
||||
if(invPlayer.getItemStack() != null && index == -999) {
|
||||
if(button == 0) {
|
||||
player.dropPlayerItemWithRandomChoice(invPlayer.getItemStack(), true);
|
||||
invPlayer.setItemStack((ItemStack) null);
|
||||
}
|
||||
|
||||
if(button == 1) {
|
||||
player.dropPlayerItemWithRandomChoice(invPlayer.getItemStack().splitStack(1), true);
|
||||
|
||||
if(invPlayer.getItemStack().stackSize == 0) {
|
||||
invPlayer.setItemStack((ItemStack) null);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if(mode == 1) {
|
||||
if(index < 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
slot = (Slot) this.inventorySlots.get(index);
|
||||
|
||||
if(slot != null && slot.canTakeStack(player)) {
|
||||
itemstack3 = this.transferStackInSlot(player, index);
|
||||
|
||||
if(itemstack3 != null) {
|
||||
Item item = itemstack3.getItem();
|
||||
returnStack = itemstack3.copy();
|
||||
|
||||
if(slot.getStack() != null && slot.getStack().getItem() == item) {
|
||||
this.retrySlotClick(index, button, true, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(index < 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
slot = (Slot) this.inventorySlots.get(index);
|
||||
|
||||
if(slot != null) {
|
||||
itemstack3 = slot.getStack();
|
||||
ItemStack draggedStack = invPlayer.getItemStack();
|
||||
|
||||
if(itemstack3 != null) {
|
||||
returnStack = itemstack3.copy();
|
||||
}
|
||||
|
||||
if(itemstack3 == null) {
|
||||
if(draggedStack != null && slot.isItemValid(draggedStack)) {
|
||||
l1 = button == 0 ? draggedStack.stackSize : 1;
|
||||
|
||||
if(l1 > slot.getSlotStackLimit()) {
|
||||
l1 = slot.getSlotStackLimit();
|
||||
}
|
||||
|
||||
if(draggedStack.stackSize >= l1) {
|
||||
slot.putStack(draggedStack.splitStack(l1));
|
||||
}
|
||||
|
||||
if(draggedStack.stackSize == 0) {
|
||||
invPlayer.setItemStack((ItemStack) null);
|
||||
}
|
||||
}
|
||||
} else if(slot.canTakeStack(player)) {
|
||||
if(draggedStack == null) {
|
||||
l1 = button == 0 ? itemstack3.stackSize : (itemstack3.stackSize + 1) / 2;
|
||||
itemstack5 = slot.decrStackSize(l1);
|
||||
invPlayer.setItemStack(itemstack5);
|
||||
|
||||
if(itemstack3.stackSize == 0) {
|
||||
slot.putStack((ItemStack) null);
|
||||
}
|
||||
|
||||
slot.onPickupFromSlot(player, invPlayer.getItemStack());
|
||||
} else if(slot.isItemValid(draggedStack)) {
|
||||
if(itemstack3.getItem() == draggedStack.getItem() && itemstack3.getItemDamage() == draggedStack.getItemDamage()
|
||||
&& ItemStack.areItemStackTagsEqual(itemstack3, draggedStack)) {
|
||||
l1 = button == 0 ? draggedStack.stackSize : 1;
|
||||
|
||||
if(l1 > slot.getSlotStackLimit() - itemstack3.stackSize) {
|
||||
l1 = slot.getSlotStackLimit() - itemstack3.stackSize;
|
||||
}
|
||||
|
||||
if(l1 > draggedStack.getMaxStackSize() - itemstack3.stackSize) {
|
||||
l1 = draggedStack.getMaxStackSize() - itemstack3.stackSize;
|
||||
}
|
||||
|
||||
draggedStack.splitStack(l1);
|
||||
|
||||
if(draggedStack.stackSize == 0) {
|
||||
invPlayer.setItemStack((ItemStack) null);
|
||||
}
|
||||
|
||||
itemstack3.stackSize += l1;
|
||||
} else if(draggedStack.stackSize <= slot.getSlotStackLimit()) {
|
||||
slot.putStack(draggedStack);
|
||||
invPlayer.setItemStack(itemstack3);
|
||||
}
|
||||
} else if(itemstack3.getItem() == draggedStack.getItem() && draggedStack.getMaxStackSize() > 1
|
||||
&& (!itemstack3.getHasSubtypes() || itemstack3.getItemDamage() == draggedStack.getItemDamage()) && ItemStack.areItemStackTagsEqual(itemstack3, draggedStack)) {
|
||||
l1 = itemstack3.stackSize;
|
||||
|
||||
if(l1 > 0 && l1 + draggedStack.stackSize <= draggedStack.getMaxStackSize()) {
|
||||
draggedStack.stackSize += l1;
|
||||
itemstack3 = slot.decrStackSize(l1);
|
||||
|
||||
if(itemstack3.stackSize == 0) {
|
||||
slot.putStack((ItemStack) null);
|
||||
}
|
||||
|
||||
slot.onPickupFromSlot(player, invPlayer.getItemStack());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
slot.onSlotChanged();
|
||||
}
|
||||
}
|
||||
} else if(mode == 2 && button >= 0 && button < 9) {
|
||||
slot = (Slot) this.inventorySlots.get(index);
|
||||
|
||||
if(slot.canTakeStack(player)) {
|
||||
itemstack3 = invPlayer.getStackInSlot(button);
|
||||
boolean flag = itemstack3 == null || slot.inventory == invPlayer && slot.isItemValid(itemstack3);
|
||||
l1 = -1;
|
||||
|
||||
if(!flag) {
|
||||
l1 = invPlayer.getFirstEmptyStack();
|
||||
flag |= l1 > -1;
|
||||
}
|
||||
|
||||
if(slot.getHasStack() && flag) {
|
||||
itemstack5 = slot.getStack();
|
||||
invPlayer.setInventorySlotContents(button, itemstack5.copy());
|
||||
|
||||
if((slot.inventory != invPlayer || !slot.isItemValid(itemstack3)) && itemstack3 != null) {
|
||||
if(l1 > -1) {
|
||||
invPlayer.addItemStackToInventory(itemstack3);
|
||||
slot.decrStackSize(itemstack5.stackSize);
|
||||
slot.putStack((ItemStack) null);
|
||||
slot.onPickupFromSlot(player, itemstack5);
|
||||
}
|
||||
} else {
|
||||
slot.decrStackSize(itemstack5.stackSize);
|
||||
slot.putStack(itemstack3);
|
||||
slot.onPickupFromSlot(player, itemstack5);
|
||||
}
|
||||
} else if(!slot.getHasStack() && itemstack3 != null && slot.isItemValid(itemstack3)) {
|
||||
invPlayer.setInventorySlotContents(button, (ItemStack) null);
|
||||
slot.putStack(itemstack3);
|
||||
}
|
||||
}
|
||||
} else if(mode == 3 && player.capabilities.isCreativeMode && invPlayer.getItemStack() == null && index >= 0) {
|
||||
slot = (Slot) this.inventorySlots.get(index);
|
||||
|
||||
if(slot != null && slot.getHasStack()) {
|
||||
itemstack3 = slot.getStack().copy();
|
||||
itemstack3.stackSize = itemstack3.getMaxStackSize();
|
||||
invPlayer.setItemStack(itemstack3);
|
||||
}
|
||||
} else if(mode == 4 && invPlayer.getItemStack() == null && index >= 0) {
|
||||
slot = (Slot) this.inventorySlots.get(index);
|
||||
|
||||
if(slot != null && slot.getHasStack() && slot.canTakeStack(player)) {
|
||||
itemstack3 = slot.decrStackSize(button == 0 ? 1 : slot.getStack().stackSize);
|
||||
slot.onPickupFromSlot(player, itemstack3);
|
||||
player.dropPlayerItemWithRandomChoice(itemstack3, true);
|
||||
}
|
||||
} else if(mode == 6 && index >= 0) {
|
||||
slot = (Slot) this.inventorySlots.get(index);
|
||||
itemstack3 = invPlayer.getItemStack();
|
||||
|
||||
if(itemstack3 != null && (slot == null || !slot.getHasStack() || !slot.canTakeStack(player))) {
|
||||
i1 = button == 0 ? 0 : this.inventorySlots.size() - 1;
|
||||
l1 = button == 0 ? 1 : -1;
|
||||
|
||||
for(int i2 = 0; i2 < 2; ++i2) {
|
||||
for(int j2 = i1; j2 >= 0 && j2 < this.inventorySlots.size() && itemstack3.stackSize < itemstack3.getMaxStackSize(); j2 += l1) {
|
||||
Slot slot3 = (Slot) this.inventorySlots.get(j2);
|
||||
|
||||
if(slot3.getHasStack() && func_94527_a(slot3, itemstack3, true) && slot3.canTakeStack(player) && this.func_94530_a(itemstack3, slot3)
|
||||
&& (i2 != 0 || slot3.getStack().stackSize != slot3.getStack().getMaxStackSize())) {
|
||||
int k1 = Math.min(itemstack3.getMaxStackSize() - itemstack3.stackSize, slot3.getStack().stackSize);
|
||||
ItemStack itemstack2 = slot3.decrStackSize(k1);
|
||||
itemstack3.stackSize += k1;
|
||||
|
||||
if(itemstack2.stackSize <= 0) {
|
||||
slot3.putStack((ItemStack) null);
|
||||
}
|
||||
|
||||
slot3.onPickupFromSlot(player, itemstack2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.detectAndSendChanges();
|
||||
}
|
||||
}
|
||||
|
||||
return returnStack;
|
||||
}
|
||||
}
|
||||
@ -3,6 +3,7 @@ package com.hbm.inventory.container;
|
||||
import com.hbm.inventory.SlotTakeOnly;
|
||||
import com.hbm.items.ModItems;
|
||||
import com.hbm.tileentity.machine.albion.TileEntityPASource;
|
||||
import com.hbm.util.InventoryUtil;
|
||||
|
||||
import api.hbm.energymk2.IBatteryItem;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@ -59,9 +60,9 @@ public class ContainerPASource extends Container {
|
||||
} else {
|
||||
|
||||
if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) {
|
||||
if(!this.mergeItemStack(stack, 0, 1, false)) return null;
|
||||
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 0, 1, false)) return null;
|
||||
} else {
|
||||
if(!this.mergeItemStack(stack, 1, 3, false)) return null;
|
||||
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 1, 3, false)) return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -17,9 +17,9 @@ import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
||||
|
||||
|
||||
public static final List<ParticleAcceleratorRecipe> recipes = new ArrayList();
|
||||
|
||||
|
||||
@Override
|
||||
public void registerDefaults() {
|
||||
|
||||
@ -94,31 +94,31 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
||||
new ItemStack(ModItems.nugget)
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
public static ParticleAcceleratorRecipe getOutput(ItemStack input1, ItemStack input2) {
|
||||
|
||||
|
||||
for(ParticleAcceleratorRecipe recipe : recipes) {
|
||||
|
||||
|
||||
if(((recipe.input1.matchesRecipe(input1, true) && recipe.input2.matchesRecipe(input2, true)) ||
|
||||
(recipe.input1.matchesRecipe(input2, true) && recipe.input2.matchesRecipe(input1, true)))) {
|
||||
return recipe;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static HashMap getRecipes() {
|
||||
|
||||
|
||||
HashMap<Object[], Object> recipes = new HashMap<Object[], Object>();
|
||||
|
||||
|
||||
for(ParticleAcceleratorRecipe entry : ParticleAcceleratorRecipes.recipes) {
|
||||
List<ItemStack> outputs = new ArrayList();
|
||||
if(entry.output1 != null) outputs.add(entry.output1);
|
||||
if(entry.output2 != null) outputs.add(entry.output2);
|
||||
recipes.put(new Object[] {entry.input1, entry.input2}, outputs.toArray(new ItemStack[0]));
|
||||
}
|
||||
|
||||
|
||||
return recipes;
|
||||
}
|
||||
|
||||
@ -128,7 +128,7 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
||||
public int momentum;
|
||||
public ItemStack output1;
|
||||
public ItemStack output2;
|
||||
|
||||
|
||||
public ParticleAcceleratorRecipe(AStack in1, AStack in2, int momentum, ItemStack out1, ItemStack out2) {
|
||||
this.input1 = in1;
|
||||
this.input2 = in2;
|
||||
@ -136,6 +136,12 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
||||
this.output1 = out1;
|
||||
this.output2 = out2;
|
||||
}
|
||||
|
||||
// it makes more sense to have this logic here
|
||||
public boolean matchesRecipe(ItemStack in1, ItemStack in2) {
|
||||
return this.input1.matchesRecipe(in1, true) && this.input2.matchesRecipe(in2, true)
|
||||
|| this.input1.matchesRecipe(in2, true) && this.input2.matchesRecipe(in1, true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -159,7 +165,7 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
||||
int momentum = obj.get("momentum").getAsInt();
|
||||
AStack[] in = this.readAStackArray(obj.get("inputs").getAsJsonArray());
|
||||
ItemStack[] out = this.readItemStackArray(obj.get("outputs").getAsJsonArray());
|
||||
|
||||
|
||||
this.recipes.add(new ParticleAcceleratorRecipe(
|
||||
in[0],
|
||||
in[1],
|
||||
@ -172,14 +178,14 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
||||
@Override
|
||||
public void writeRecipe(Object recipe, JsonWriter writer) throws IOException {
|
||||
ParticleAcceleratorRecipe rec = (ParticleAcceleratorRecipe) recipe;
|
||||
|
||||
|
||||
writer.name("momentum").value(rec.momentum);
|
||||
|
||||
|
||||
writer.name("inputs").beginArray();
|
||||
this.writeAStack(rec.input1, writer);
|
||||
this.writeAStack(rec.input2, writer);
|
||||
writer.endArray();
|
||||
|
||||
|
||||
writer.name("outputs").beginArray();
|
||||
this.writeItemStack(rec.output1, writer);
|
||||
if(rec.output2 != null) this.writeItemStack(rec.output2, writer);
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.hbm.items;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
@ -14,6 +15,7 @@ import net.minecraft.item.EnumRarity;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumChatFormatting;
|
||||
import net.minecraft.util.StatCollector;
|
||||
|
||||
public class ItemCustomLore extends Item {
|
||||
|
||||
@ -104,4 +106,121 @@ public class ItemCustomLore extends Item {
|
||||
setTextureName(RefStrings.MODID + ':' + uloc);
|
||||
return super.setUnlocalizedName(uloc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack stack) {
|
||||
if(stack.getItem() == ModItems.undefined && stack.getItemDamage() != 99) return ("" + StatCollector.translateToLocal(this.getUnlocalizedNameInefficiently(stack) + ".name")).trim();
|
||||
|
||||
return name.getResult();
|
||||
}
|
||||
|
||||
public static String[] names = new String[] {
|
||||
"THE DEFAULT", "NEXT ONE", "ANOTHER ONE", "NON-STANDARD NAME", "AMBIGUOUS TITLE", "SHORT"
|
||||
};
|
||||
|
||||
public static Random rand = new Random();
|
||||
public static int currentIndex = 0;
|
||||
public static ScramblingName name = new ScramblingName(names[0]);
|
||||
|
||||
public static void updateSystem() {
|
||||
name.updateTick(names);
|
||||
}
|
||||
|
||||
/**
|
||||
* A surprise tool we need for later
|
||||
* @author hbm
|
||||
*/
|
||||
public static class ScramblingName {
|
||||
|
||||
public String previous;
|
||||
public String next;
|
||||
public String[] previousFrags;
|
||||
public String[] nextFrags;
|
||||
public String[] frags;
|
||||
public int[] mask;
|
||||
public int age = 0;
|
||||
|
||||
public ScramblingName(String init) {
|
||||
previous = next = init;
|
||||
frags = init.split("");
|
||||
mask = new int[frags.length];
|
||||
previousFrags = chop(previous, frags.length);
|
||||
nextFrags = chop(next, frags.length);
|
||||
}
|
||||
|
||||
public String getResult() {
|
||||
return String.join("", frags);
|
||||
}
|
||||
|
||||
public void updateTick(String[] nextNames) {
|
||||
age++;
|
||||
try {
|
||||
//pick new name
|
||||
if(age % 200 == 0) nextName(nextNames);
|
||||
//run substitution
|
||||
if(age % 5 == 0) scramble();
|
||||
} catch(Exception ex) { }
|
||||
}
|
||||
|
||||
public void nextName(String[] nextNames) {
|
||||
if(nextNames.length < 2) return;
|
||||
|
||||
this.previous = this.next;
|
||||
|
||||
String initial = next;
|
||||
//keep choosing new names until it's different
|
||||
while(initial.equals(next)) {
|
||||
next = nextNames[rand.nextInt(nextNames.length)];
|
||||
}
|
||||
|
||||
//frag setup
|
||||
int length = Math.min(previous.length(), next.length());
|
||||
this.previousFrags = chop(previous, length);
|
||||
this.frags = chop(previous, length);
|
||||
this.nextFrags = chop(next, length);
|
||||
mask = new int[length];
|
||||
}
|
||||
|
||||
public void scramble() {
|
||||
|
||||
//all fragments that haven't been substituted
|
||||
List<Integer> indices = new ArrayList();
|
||||
|
||||
for(int i = 0; i < mask.length; i++) {
|
||||
int m = mask[i];
|
||||
//mask 0 means not yet processed
|
||||
if(m == 0) indices.add(i);
|
||||
//mask 1-5 means obfuscated
|
||||
if(m > 0 && m <= 5) mask[i]++;
|
||||
//mask >5 means replaced
|
||||
if(m > 5) frags[i] = nextFrags[i];
|
||||
}
|
||||
|
||||
//if there's at least one index listed, start processing
|
||||
if(!indices.isEmpty()) {
|
||||
int toSwitch = indices.get(rand.nextInt(indices.size()));
|
||||
mask[toSwitch] = 1;
|
||||
frags[toSwitch] = EnumChatFormatting.OBFUSCATED + previousFrags[toSwitch] + EnumChatFormatting.RESET;
|
||||
}
|
||||
}
|
||||
|
||||
public String[] chop(String name, int parts) {
|
||||
if(parts == name.length()) return name.split("");
|
||||
|
||||
double index = 0;
|
||||
double incrementPerStep = (double) name.length() / (double) parts;
|
||||
List<String> slices = new ArrayList();
|
||||
|
||||
for(int i = 0; i < parts; i++) {
|
||||
int end = (i == parts - 1) ? name.length() : (int) (index + incrementPerStep);
|
||||
slices.add(name.substring((int) index, end));
|
||||
index += incrementPerStep;
|
||||
}
|
||||
|
||||
String[] chop = slices.toArray(new String[parts]);
|
||||
//System.out.println("Chopped " + name + " into " + parts + " pieces: " + chop);
|
||||
|
||||
return chop;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1500,6 +1500,7 @@ public class ModItems {
|
||||
public static Item gun_hangman;
|
||||
public static Item gun_bolter;
|
||||
public static Item gun_folly;
|
||||
public static Item gun_aberrator;
|
||||
public static Item gun_double_barrel;
|
||||
public static Item gun_double_barrel_sacred_dragon;
|
||||
|
||||
@ -6493,6 +6494,7 @@ public class ModItems {
|
||||
GameRegistry.registerItem(gun_hangman, gun_hangman.getUnlocalizedName());
|
||||
GameRegistry.registerItem(gun_bolter, gun_bolter.getUnlocalizedName());
|
||||
GameRegistry.registerItem(gun_folly, gun_folly.getUnlocalizedName());
|
||||
GameRegistry.registerItem(gun_aberrator, gun_aberrator.getUnlocalizedName());
|
||||
GameRegistry.registerItem(gun_double_barrel, gun_double_barrel.getUnlocalizedName());
|
||||
GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.getUnlocalizedName());
|
||||
|
||||
|
||||
@ -46,5 +46,6 @@ public class ItemPACoil extends ItemEnumMulti {
|
||||
list.add(EnumChatFormatting.BLUE + "Dipole minimum side length: " + EnumChatFormatting.RESET + type.diDistMin);
|
||||
list.add(EnumChatFormatting.RED + "Minimums not met result in a power draw penalty!");
|
||||
list.add(EnumChatFormatting.RED + "Maximums exceeded result in the particle crashing!");
|
||||
list.add(EnumChatFormatting.RED + "Particles will crash in dipoles if both penalties take effect!");
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,6 +65,7 @@ public class GunFactory {
|
||||
XFactoryFolly.init();
|
||||
XFactoryTurret.init();
|
||||
XFactory10ga.init();
|
||||
XFactory35800.init();
|
||||
|
||||
/// PROXY BULLSHIT ///
|
||||
MainRegistry.proxy.registerGunCfg();
|
||||
@ -124,6 +125,7 @@ public class GunFactory {
|
||||
|
||||
public static enum EnumAmmoSecret {
|
||||
FOLLY_SM, FOLLY_NUKE,
|
||||
M44_EQUESTRIAN, G12_EQUESTRIAN, BMG50_EQUESTRIAN
|
||||
M44_EQUESTRIAN, G12_EQUESTRIAN, BMG50_EQUESTRIAN,
|
||||
P35_800
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import static com.hbm.items.weapon.sedna.factory.XFactory10ga.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory12ga.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory22lr.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory357.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory35800.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory40mm.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory44.*;
|
||||
import static com.hbm.items.weapon.sedna.factory.XFactory50.*;
|
||||
@ -82,6 +83,7 @@ public class GunFactoryClient {
|
||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_hangman, new ItemRenderHangman());
|
||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter());
|
||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_folly, new ItemRenderFolly());
|
||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_aberrator, new ItemRenderAberrator());
|
||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex));
|
||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex));
|
||||
//PROJECTILES
|
||||
@ -189,6 +191,8 @@ public class GunFactoryClient {
|
||||
|
||||
folly_sm.setRendererBeam(LegoClient.RENDER_FOLLY);
|
||||
folly_nuke.setRenderer(LegoClient.RENDER_BIG_NUKE);
|
||||
|
||||
p35800.setRendererBeam(LegoClient.RENDER_LASER_WHITE);
|
||||
|
||||
setRendererBulk(LegoClient.RENDER_GRENADE, shell_normal, shell_explosive, shell_ap, shell_du, shell_w9); //TODO: change the sabots
|
||||
|
||||
@ -236,6 +240,7 @@ public class GunFactoryClient {
|
||||
((ItemGunBaseNT) ModItems.gun_hangman) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO);
|
||||
((ItemGunBaseNT) ModItems.gun_bolter) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO);
|
||||
((ItemGunBaseNT) ModItems.gun_folly) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO);
|
||||
((ItemGunBaseNT) ModItems.gun_aberrator) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_AMMO);
|
||||
((ItemGunBaseNT) ModItems.gun_double_barrel) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO);
|
||||
((ItemGunBaseNT) ModItems.gun_double_barrel_sacred_dragon) .getConfig(null, 0).hud(LegoClient.HUD_COMPONENT_DURABILITY, LegoClient.HUD_COMPONENT_AMMO);
|
||||
|
||||
|
||||
@ -328,6 +328,9 @@ public class LegoClient {
|
||||
public static BiConsumer<EntityBulletBeamBase, Float> RENDER_LASER_PURPLE = (bullet, interp) -> {
|
||||
renderStandardLaser(bullet, interp, 0x60, 0x15, 0x80);
|
||||
};
|
||||
public static BiConsumer<EntityBulletBeamBase, Float> RENDER_LASER_WHITE = (bullet, interp) -> {
|
||||
renderStandardLaser(bullet, interp, 0x15, 0x15, 0x15);
|
||||
};
|
||||
|
||||
public static void renderStandardLaser(EntityBulletBeamBase bullet, float interp, int r, int g, int b) {
|
||||
|
||||
|
||||
@ -1278,4 +1278,30 @@ public class Orchestras {
|
||||
if(timer == 2) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 1F);
|
||||
}
|
||||
};
|
||||
|
||||
public static BiConsumer<ItemStack, LambdaContext> ORCHESTRA_ABERRATOR = (stack, ctx) -> {
|
||||
EntityLivingBase entity = ctx.entity;
|
||||
if(entity.worldObj.isRemote) return;
|
||||
AnimType type = ItemGunBaseNT.getLastAnim(stack, ctx.configIndex);
|
||||
int timer = ItemGunBaseNT.getAnimTimer(stack, ctx.configIndex);
|
||||
boolean aiming = ItemGunBaseNT.getIsAiming(stack);
|
||||
|
||||
if(type == AnimType.RELOAD) {
|
||||
if(timer == 5) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallRemove", 1F, 0.75F);
|
||||
if(timer == 32) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.magSmallInsert", 1F, 0.75F);
|
||||
if(timer == 42) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.75F);
|
||||
}
|
||||
|
||||
if(type == AnimType.CYCLE) {
|
||||
if(timer == 1) {
|
||||
SpentCasing casing = ctx.config.getReceivers(stack)[0].getMagazine(stack).getCasing(stack, ctx.inventory);
|
||||
if(casing != null) CasingCreator.composeEffect(entity.worldObj, entity, 0.375, aiming ? 0 : -0.125, aiming ? -0.0625 : -0.25D, -0.075, 0.25, 0, 0.01, casing.getName());
|
||||
}
|
||||
}
|
||||
|
||||
if(type == AnimType.CYCLE_DRY) {
|
||||
if(timer == 1) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.dryFireClick", 1F, 0.75F);
|
||||
if(timer == 9) entity.worldObj.playSoundAtEntity(entity, "hbm:weapon.reload.pistolCock", 1F, 0.75F);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@ -0,0 +1,76 @@
|
||||
package com.hbm.items.weapon.sedna.factory;
|
||||
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import com.hbm.items.ModItems;
|
||||
import com.hbm.items.weapon.sedna.BulletConfig;
|
||||
import com.hbm.items.weapon.sedna.Crosshair;
|
||||
import com.hbm.items.weapon.sedna.GunConfig;
|
||||
import com.hbm.items.weapon.sedna.ItemGunBaseNT;
|
||||
import com.hbm.items.weapon.sedna.Receiver;
|
||||
import com.hbm.items.weapon.sedna.ItemGunBaseNT.WeaponQuality;
|
||||
import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmoSecret;
|
||||
import com.hbm.items.weapon.sedna.mags.MagazineFullReload;
|
||||
import com.hbm.particle.SpentCasing;
|
||||
import com.hbm.particle.SpentCasing.CasingType;
|
||||
import com.hbm.render.anim.BusAnimation;
|
||||
import com.hbm.render.anim.BusAnimationSequence;
|
||||
import com.hbm.render.anim.BusAnimationKeyframe.IType;
|
||||
import com.hbm.render.anim.HbmAnimations.AnimType;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
public class XFactory35800 {
|
||||
|
||||
public static BulletConfig p35800;
|
||||
|
||||
public static void init() {
|
||||
|
||||
p35800 = new BulletConfig().setItem(EnumAmmoSecret.P35_800).setArmorPiercing(0.5F).setThresholdNegation(50F).setBeam().setSpread(0.0F).setLife(3).setRenderRotations(false)
|
||||
.setCasing(new SpentCasing(CasingType.STRAIGHT).setColor(0xCEB78E).register("35-800")).setOnBeamImpact(BulletConfig.LAMBDA_STANDARD_BEAM_HIT);
|
||||
|
||||
ModItems.gun_aberrator = new ItemGunBaseNT(WeaponQuality.SECRET, new GunConfig()
|
||||
.dura(2_000).draw(10).inspect(26).reloadSequential(true).crosshair(Crosshair.CIRCLE).smoke(Lego.LAMBDA_STANDARD_SMOKE)
|
||||
.rec(new Receiver(0)
|
||||
.dmg(50F).delay(13).dry(21).reload(51).sound("hbm:weapon.fire.aberrator", 1.0F, 1.0F)
|
||||
.mag(new MagazineFullReload(0, 5).addConfigs(p35800))
|
||||
.offset(0.75, -0.0625 * 1.5, -0.1875)
|
||||
.canFire(Lego.LAMBDA_STANDARD_CAN_FIRE).fire(Lego.LAMBDA_NOWEAR_FIRE))
|
||||
.setupStandardConfiguration()
|
||||
.anim(LAMBDA_ABERRATOR).orchestra(Orchestras.ORCHESTRA_ABERRATOR)
|
||||
).setUnlocalizedName("gun_aberrator");
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch") public static BiFunction<ItemStack, AnimType, BusAnimation> LAMBDA_ABERRATOR = (stack, type) -> {
|
||||
boolean aim = ItemGunBaseNT.getIsAiming(stack);
|
||||
int ammo = ((ItemGunBaseNT) stack.getItem()).getConfig(stack, 0).getReceivers(stack)[0].getMagazine(stack).getAmount(stack, null);
|
||||
switch(type) {
|
||||
case EQUIP: return new BusAnimation()
|
||||
.addBus("EQUIP", new BusAnimationSequence().addPos(360, 0, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL))
|
||||
.addBus("RISE", new BusAnimationSequence().addPos(0, -3, 0, 0).addPos(0, 0, 0, 500, IType.SIN_FULL));
|
||||
case CYCLE: return new BusAnimation()
|
||||
.addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(aim ? -15 : -25, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 500, IType.SIN_FULL))
|
||||
.addBus("SIGHT", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(aim ? 5 : 15, 0, 0, 100, IType.SIN_DOWN).addPos(0, 0, 0, 250, IType.SIN_FULL))
|
||||
.addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 50).addPos(0, 0, -1.125, 50, IType.SIN_DOWN).addPos(0, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP))
|
||||
.addBus(ammo <= 1 ? "NULL" : "BULLET", new BusAnimationSequence().addPos(0, 0, 0, 150).addPos(0, 0.375, 1.125, 150, IType.SIN_UP))
|
||||
.addBus("HAMMER", new BusAnimationSequence().addPos(45, 0, 0, 50).addPos(-45, 0, -1.125, 50, IType.SIN_DOWN).addPos(-20, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP));
|
||||
case CYCLE_DRY: return new BusAnimation()
|
||||
.addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 700).addPos(-5, 0, 0, 100, IType.SIN_FULL).addPos(0, 0, 0, 250, IType.SIN_FULL))
|
||||
.addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 550).addPos(0, 0, -1.125, 150, IType.SIN_FULL).addPos(0, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP))
|
||||
.addBus("HAMMER", new BusAnimationSequence().addPos(45, 0, 0, 50).addPos(45, 0, 0, 500).addPos(-45, 0, -1.125, 150, IType.SIN_FULL).addPos(-20, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP));
|
||||
case RELOAD: return new BusAnimation()
|
||||
.addBus("ROLL", new BusAnimationSequence().addPos(0, 0, 20, 150, IType.SIN_FULL).addPos(0, 0, 20, 50).addPos(0, 0, -45, 150, IType.SIN_UP).addPos(0, 0, 0, 150, IType.SIN_FULL))
|
||||
.addBus("MAG", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, -2, 0, 0).addPos(-15, -5, 0, 350).addPos(-15, 0, 0, 0).addPos(-15, 0, 0, 700).addPos(3, 3, 0, 0).addPos(0, -2, 0, 250, IType.SIN_DOWN).addPos(0, -2, 0, 50).addPos(0, 0, 0, 150, IType.SIN_DOWN))
|
||||
.addBus("MAGROLL", new BusAnimationSequence().addPos(0, 0, 0, 350).addPos(0, 0, -180, 250).addPos(0, 0, 0, 0))
|
||||
.addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 750).addPos(5, 0, 0, 150, IType.SIN_FULL).addPos(-190, 0, 0, 500, IType.SIN_FULL).addPos(-190, 0, 0, 450).addPos(-360, 0, 0, 350, IType.SIN_DOWN).addPos(0, 0, 0, 0))
|
||||
.addBus("RECOIL", new BusAnimationSequence().addPos(0, 0, 0, 2350).addPos(-5, 0, 0, 100, IType.SIN_FULL).addPos(0, 0, 0, 250, IType.SIN_FULL))
|
||||
.addBus("SLIDE", new BusAnimationSequence().addPos(0, 0, 0, 2200).addPos(0, 0, -1.125, 150, IType.SIN_FULL).addPos(0, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP))
|
||||
.addBus("HAMMER", new BusAnimationSequence().addPos(0, 0, 0, 2250).addPos(-45, 0, -1.125, 100, IType.SIN_FULL).addPos(-20, 0, -1.125, 50).addPos(0, 0, 0, 150, IType.SIN_UP))
|
||||
.addBus("BULLET", new BusAnimationSequence().addPos(ammo > 0 ? 0 : -100, 0, 0, 0).addPos(ammo > 0 ? 0 : -100, 0, 0, 2400).addPos(0, 0, 0, 0).addPos(0, 0.375, 1.125, 150, IType.SIN_UP));
|
||||
case INSPECT: return new BusAnimation()
|
||||
.addBus("EQUIP", new BusAnimationSequence().addPos(0, 0, 0, 0).addPos(-720, 0, 0, 1000, IType.SIN_FULL).addPos(-720, 0, 0, 250).addPos(0, 0, 0, 1000, IType.SIN_FULL));
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
}
|
||||
@ -3,7 +3,7 @@ package com.hbm.lib;
|
||||
public class RefStrings {
|
||||
public static final String MODID = "hbm";
|
||||
public static final String NAME = "Hbm's Nuclear Tech Mod";
|
||||
public static final String VERSION = "1.0.27 BETA (5229)";
|
||||
public static final String VERSION = "1.0.27 BETA (5230)";
|
||||
//HBM's Beta Naming Convention:
|
||||
//V T (X)
|
||||
//V -> next release version
|
||||
|
||||
@ -127,7 +127,7 @@ public class CraftingManager {
|
||||
|
||||
addRecipeAuto(new ItemStack(ModItems.cell_empty, 6), new Object[] { " S ", "G G", " S ", 'S', STEEL.plate(), 'G', KEY_ANYPANE });
|
||||
addRecipeAuto(new ItemStack(ModItems.cell_deuterium, 8), new Object[] { "DDD", "DTD", "DDD", 'D', ModItems.cell_empty, 'T', ModItems.mike_deut });
|
||||
addRecipeAuto(new ItemStack(ModItems.particle_empty, 2), new Object[] { "STS", "G G", "STS", 'S', STEEL.plate(), 'T', W.ingot(), 'G', KEY_ANYPANE });
|
||||
addRecipeAuto(new ItemStack(ModItems.particle_empty, 2), new Object[] { "STS", "G G", "STS", 'S', PB.plateCast(), 'T', ModItems.coil_gold, 'G', KEY_ANYPANE });
|
||||
addShapelessAuto(new ItemStack(ModItems.particle_copper, 1), new Object[] { ModItems.particle_empty, CU.dust(), ModItems.pellet_charged });
|
||||
addShapelessAuto(new ItemStack(ModItems.particle_lead, 1), new Object[] { ModItems.particle_empty, PB.dust(), ModItems.pellet_charged });
|
||||
addShapelessAuto(new ItemStack(ModItems.cell_antimatter, 1), new Object[] { ModItems.particle_aproton, ModItems.particle_aelectron, ModItems.cell_empty });
|
||||
|
||||
@ -25,6 +25,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack;
|
||||
import com.hbm.inventory.gui.GUIArmorTable;
|
||||
import com.hbm.inventory.gui.GUIScreenPreview;
|
||||
import com.hbm.inventory.gui.GUIScreenWikiRender;
|
||||
import com.hbm.items.ItemCustomLore;
|
||||
import com.hbm.items.ModItems;
|
||||
import com.hbm.items.armor.*;
|
||||
import com.hbm.items.machine.ItemDepletedFuel;
|
||||
@ -1389,6 +1390,8 @@ public class ModEventHandlerClient {
|
||||
client.sendQueue.addToSendQueue(new C0CPacketInput(client.moveStrafing, client.moveForward, client.movementInput.jump, client.movementInput.sneak));
|
||||
}
|
||||
}
|
||||
|
||||
if(event.phase == event.phase.END) ItemCustomLore.updateSystem();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
|
||||
@ -70,6 +70,7 @@ public class NEIRegistry {
|
||||
handlers.add(new AmmoPressHandler());
|
||||
handlers.add(new CompressorHandler());
|
||||
handlers.add(new ParticleAcceleratorHandler());
|
||||
handlers.add(new DeuteriumHandler());
|
||||
|
||||
//this shit comes last
|
||||
handlers.add(new FluidRecipeHandler());
|
||||
|
||||
@ -888,6 +888,7 @@ public class ResourceManager {
|
||||
public static final IModelCustom hangman = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/hangman.obj")).asVBO();
|
||||
public static final IModelCustom folly = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/folly.obj")).asVBO();
|
||||
public static final IModelCustom double_barrel = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/sacred_dragon.obj")).asVBO();
|
||||
public static final IModelCustom aberrator = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/aberrator.obj")).asVBO();
|
||||
|
||||
public static final HashMap<String, BusAnimation> python_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/python.json"));
|
||||
public static final HashMap<String, BusAnimation> cursed_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/cursed.json"));
|
||||
@ -1036,6 +1037,7 @@ public class ResourceManager {
|
||||
public static final ResourceLocation folly_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/moonlight.png");
|
||||
public static final ResourceLocation double_barrel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel.png");
|
||||
public static final ResourceLocation double_barrel_sacred_dragon_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/double_barrel_sacred_dragon.png");
|
||||
public static final ResourceLocation aberrator_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/aberrator.png");
|
||||
|
||||
public static final ResourceLocation lance_tex = new ResourceLocation(RefStrings.MODID, "textures/models/weapons/lance.png");
|
||||
|
||||
|
||||
@ -0,0 +1,240 @@
|
||||
package com.hbm.render.item.weapon.sedna;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.hbm.items.weapon.sedna.ItemGunBaseNT;
|
||||
import com.hbm.main.ResourceManager;
|
||||
import com.hbm.render.anim.HbmAnimations;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.IIcon;
|
||||
|
||||
public class ItemRenderAberrator extends ItemRenderWeaponBase {
|
||||
|
||||
@Override
|
||||
protected float getTurnMagnitude(ItemStack stack) { return ItemGunBaseNT.getIsAiming(stack) ? 2.5F : -0.25F; }
|
||||
|
||||
@Override
|
||||
public float getViewFOV(ItemStack stack, float fov) {
|
||||
float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp;
|
||||
return fov * (1 - aimingProgress * 0.33F);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupFirstPerson(ItemStack stack) {
|
||||
GL11.glTranslated(0, 0, 1);
|
||||
|
||||
float offset = 0.8F;
|
||||
standardAimingTransform(stack,
|
||||
-1.0F * offset, -1.25F * offset, 1.25F * offset,
|
||||
0, -5.25 / 8D, 0.125);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderFirstPerson(ItemStack stack) {
|
||||
|
||||
ItemGunBaseNT gun = (ItemGunBaseNT) stack.getItem();
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.aberrator_tex);
|
||||
double scale = 0.25D;
|
||||
GL11.glScaled(scale, scale, scale);
|
||||
|
||||
double[] equip = HbmAnimations.getRelevantTransformation("EQUIP");
|
||||
double[] rise = HbmAnimations.getRelevantTransformation("RISE");
|
||||
double[] recoil = HbmAnimations.getRelevantTransformation("RECOIL");
|
||||
double[] slide = HbmAnimations.getRelevantTransformation("SLIDE");
|
||||
double[] bullet = HbmAnimations.getRelevantTransformation("BULLET");
|
||||
double[] hammer = HbmAnimations.getRelevantTransformation("HAMMER");
|
||||
double[] roll = HbmAnimations.getRelevantTransformation("ROLL");
|
||||
double[] mag = HbmAnimations.getRelevantTransformation("MAG");
|
||||
double[] magroll = HbmAnimations.getRelevantTransformation("MAGROLL");
|
||||
double[] sight = HbmAnimations.getRelevantTransformation("SIGHT");
|
||||
|
||||
GL11.glTranslated(0, rise[1], 0);
|
||||
|
||||
GL11.glTranslated(0, 1, -2.25);
|
||||
GL11.glRotated(equip[0], 1, 0, 0);
|
||||
GL11.glTranslated(0, -1, 2.25);
|
||||
|
||||
GL11.glTranslated(0, -1, -4);
|
||||
GL11.glRotated(recoil[0], 1, 0, 0);
|
||||
GL11.glTranslated(0, 1, 4);
|
||||
|
||||
GL11.glTranslated(0, 1, 0);
|
||||
GL11.glRotated(roll[2], 0, 0, 1);
|
||||
GL11.glTranslated(0, -1, 0);
|
||||
|
||||
GL11.glShadeModel(GL11.GL_SMOOTH);
|
||||
|
||||
ResourceManager.aberrator.renderPart("Gun");
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, 2.4375, -1.9375);
|
||||
GL11.glRotated(sight[0], 1, 0, 0);
|
||||
GL11.glTranslated(0, -2.4375, 1.9375);
|
||||
ResourceManager.aberrator.renderPart("Sight");
|
||||
GL11.glPopMatrix();
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(mag[0], mag[1], mag[2]);
|
||||
|
||||
GL11.glTranslated(0, 1, 0);
|
||||
GL11.glRotated(magroll[2], 0, 0, 1);
|
||||
GL11.glTranslated(0, -1, 0);
|
||||
|
||||
ResourceManager.aberrator.renderPart("Magazine");
|
||||
GL11.glTranslated(bullet[0], bullet[1], bullet[2]);
|
||||
ResourceManager.aberrator.renderPart("Bullet");
|
||||
GL11.glPopMatrix();
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, 0, slide[2]);
|
||||
ResourceManager.aberrator.renderPart("Slide");
|
||||
GL11.glPopMatrix();
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, 1.25, -3.625);
|
||||
GL11.glRotated(-45 + hammer[0], 1, 0, 0);
|
||||
GL11.glTranslated(0, -1.25, 3.625);
|
||||
ResourceManager.aberrator.renderPart("Hammer");
|
||||
GL11.glPopMatrix();
|
||||
|
||||
double smokeScale = 0.5;
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, 2, 4);
|
||||
GL11.glRotated(recoil[0], -1, 0, 0);
|
||||
GL11.glRotated(roll[2], 0, 0, -1);
|
||||
GL11.glRotated(90, 0, 1, 0);
|
||||
GL11.glScaled(smokeScale, smokeScale, smokeScale);
|
||||
this.renderSmokeNodes(gun.getConfig(stack, 0).smokeNodes, 0.5D);
|
||||
GL11.glPopMatrix();
|
||||
|
||||
GL11.glShadeModel(GL11.GL_FLAT);
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, 2, 4);
|
||||
GL11.glRotated(90, 0, 1, 0);
|
||||
GL11.glRotated(90 * gun.shotRand, 1, 0, 0);
|
||||
GL11.glScaled(0.75, 0.75, 0.75);
|
||||
this.renderMuzzleFlash(gun.lastShot[0], 75, 7.5);
|
||||
GL11.glPopMatrix();
|
||||
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, 2, -1.5);
|
||||
GL11.glScaled(0.5, 0.5, 0.5);
|
||||
this.renderFireball(gun.lastShot[0]);
|
||||
GL11.glPopMatrix();
|
||||
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(Minecraft.getMinecraft().getTextureManager().getResourceLocation(Items.golden_sword.getSpriteNumber()));
|
||||
IIcon icon = Items.golden_sword.getIconFromDamage(0);
|
||||
|
||||
GL11.glDisable(GL11.GL_CULL_FACE);
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
float minU = icon.getMinU();
|
||||
float maxU = icon.getMaxU();
|
||||
float minV = icon.getMinV();
|
||||
float maxV = icon.getMaxV();
|
||||
GL11.glTranslated(0, 2, 4.5);
|
||||
GL11.glRotated(roll[2], 0, 0, -1);
|
||||
GL11.glRotated(recoil[0], -1, 0, 0);
|
||||
GL11.glRotated(equip[0], -1, 0, 0);
|
||||
GL11.glRotated(System.currentTimeMillis() / 50D % 360D, 0, 0, 1);
|
||||
|
||||
float aimingProgress = ItemGunBaseNT.prevAimingProgress + (ItemGunBaseNT.aimingProgress - ItemGunBaseNT.prevAimingProgress) * interp;
|
||||
aimingProgress = Math.min(1F, aimingProgress * 2);
|
||||
|
||||
Tessellator tess = Tessellator.instance;
|
||||
GL11.glPushMatrix();
|
||||
int amount = 16;
|
||||
for(int i = 0; i < amount; i++) {
|
||||
GL11.glPushMatrix();
|
||||
GL11.glTranslated(0, -1.5 - aimingProgress, 0);
|
||||
GL11.glRotated(90 * aimingProgress, 1, 0, 0);
|
||||
GL11.glRotated(-45, 0, 0, 1);
|
||||
tess.startDrawingQuads();
|
||||
tess.setNormal(0F, 1F, 0F);
|
||||
tess.addVertexWithUV(-0.5, -0.5F, -0.5, maxU, maxV);
|
||||
tess.addVertexWithUV(0.5F, -0.5F, -0.5, minU, maxV);
|
||||
tess.addVertexWithUV(0.5F, 0.5F, -0.5, minU, minV);
|
||||
tess.addVertexWithUV(-0.5, 0.5F, -0.5, maxU, minV);
|
||||
tess.draw();
|
||||
GL11.glPopMatrix();
|
||||
GL11.glRotated(360D / amount, 0, 0, 1);
|
||||
}
|
||||
GL11.glPopMatrix();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupThirdPerson(ItemStack stack) {
|
||||
super.setupThirdPerson(stack);
|
||||
GL11.glTranslated(0, -1, 4);
|
||||
double scale = 1.5D;
|
||||
GL11.glScaled(scale, scale, scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupInv(ItemStack stack) {
|
||||
super.setupInv(stack);
|
||||
double scale = 2.5D;
|
||||
GL11.glScaled(scale, scale, scale);
|
||||
GL11.glRotated(25, 1, 0, 0);
|
||||
GL11.glRotated(45, 0, 1, 0);
|
||||
GL11.glTranslated(-0.5,-1, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderOther(ItemStack stack, ItemRenderType type) {
|
||||
|
||||
GL11.glEnable(GL11.GL_LIGHTING);
|
||||
GL11.glAlphaFunc(GL11.GL_GREATER, 0F);
|
||||
GL11.glEnable(GL11.GL_ALPHA_TEST);
|
||||
|
||||
GL11.glShadeModel(GL11.GL_SMOOTH);
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.aberrator_tex);
|
||||
ResourceManager.aberrator.renderPart("Gun");
|
||||
ResourceManager.aberrator.renderPart("Hammer");
|
||||
ResourceManager.aberrator.renderPart("Magazine");
|
||||
ResourceManager.aberrator.renderPart("Slide");
|
||||
ResourceManager.aberrator.renderPart("Sight");
|
||||
GL11.glShadeModel(GL11.GL_FLAT);
|
||||
}
|
||||
|
||||
public static void renderFireball(long lastShot) {
|
||||
Tessellator tess = Tessellator.instance;
|
||||
|
||||
int flash = 150;
|
||||
|
||||
if(System.currentTimeMillis() - lastShot < flash) {
|
||||
GL11.glEnable(GL11.GL_BLEND);
|
||||
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
|
||||
GL11.glPushMatrix();
|
||||
|
||||
double fire = (System.currentTimeMillis() - lastShot) / (double) flash;
|
||||
double height = 5 * fire;
|
||||
double length = 10 * fire;
|
||||
double offset = 1 * fire;
|
||||
double lengthOffset = -1.125;
|
||||
Minecraft.getMinecraft().renderEngine.bindTexture(flash_plume);
|
||||
tess.startDrawingQuads();
|
||||
tess.setNormal(0F, 1F, 0F);
|
||||
tess.setColorRGBA_F(1F, 1F, 1F, 1F);
|
||||
|
||||
tess.addVertexWithUV(height, -offset, 0, 0, 1);
|
||||
tess.addVertexWithUV(-height, -offset, 0, 1, 1);
|
||||
tess.addVertexWithUV(-height, -offset + length, -lengthOffset, 1, 0);
|
||||
tess.addVertexWithUV(height, -offset + length, -lengthOffset, 0 ,0);
|
||||
|
||||
tess.addVertexWithUV(height, -offset, 0, 0, 1);
|
||||
tess.addVertexWithUV(-height, -offset, 0, 1, 1);
|
||||
tess.addVertexWithUV(-height, -offset + length, lengthOffset, 1, 0);
|
||||
tess.addVertexWithUV(height, -offset + length, lengthOffset, 0 ,0);
|
||||
|
||||
tess.draw();
|
||||
GL11.glPopMatrix();
|
||||
GL11.glDisable(GL11.GL_BLEND);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -121,7 +121,6 @@ public class ItemRenderGreasegun extends ItemRenderWeaponBase {
|
||||
public void setupThirdPerson(ItemStack stack) {
|
||||
super.setupThirdPerson(stack);
|
||||
GL11.glTranslated(0, 1, 3);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -77,7 +77,7 @@ public class TileEntityLoadedBase extends TileEntity implements ILoadedTile, IBu
|
||||
// In my testing, this can be reliably reproduced with a full fluid barrel, for instance.
|
||||
// I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(),
|
||||
// but this sidesteps the problem for the mean time.
|
||||
if(preBuf.equals(lastPackedBuf) && this.worldObj.getWorldTime() % 20 != 0) return;
|
||||
if(preBuf.equals(lastPackedBuf) && this.worldObj.getTotalWorldTime() % 20 != 0) return;
|
||||
|
||||
this.lastPackedBuf = preBuf.copy();
|
||||
|
||||
|
||||
@ -4,6 +4,7 @@ import com.hbm.inventory.container.ContainerPADetector;
|
||||
import com.hbm.inventory.gui.GUIPADetector;
|
||||
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes;
|
||||
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe;
|
||||
import com.hbm.lib.Library;
|
||||
import com.hbm.tileentity.IGUIProvider;
|
||||
import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState;
|
||||
import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle;
|
||||
@ -22,7 +23,7 @@ import net.minecraftforge.common.util.ForgeDirection;
|
||||
public class TileEntityPADetector extends TileEntityCooledBase implements IGUIProvider, IParticleUser {
|
||||
|
||||
public static final long usage = 100_000;
|
||||
|
||||
|
||||
public TileEntityPADetector() {
|
||||
super(5);
|
||||
}
|
||||
@ -32,6 +33,16 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
||||
return "container.paDetector";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateEntity() {
|
||||
|
||||
if(!worldObj.isRemote) {
|
||||
this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower());
|
||||
}
|
||||
|
||||
super.updateEntity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public DirPos[] getConPos() {
|
||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
||||
@ -53,12 +64,12 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
||||
@Override public boolean isItemValidForSlot(int slot, ItemStack stack) { return slot == 1 || slot == 2; }
|
||||
@Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return slot == 3 || slot == 4; }
|
||||
@Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] { 1, 2, 3, 4 }; }
|
||||
|
||||
|
||||
AxisAlignedBB bb = null;
|
||||
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
|
||||
|
||||
if(bb == null) {
|
||||
bb = AxisAlignedBB.getBoundingBox(
|
||||
xCoord - 4,
|
||||
@ -69,10 +80,10 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
||||
zCoord + 5
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
return bb;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public double getMaxRenderDistanceSquared() {
|
||||
@ -101,42 +112,47 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
||||
particle.invalid = true;
|
||||
//particle will crash if not perfectly focused
|
||||
if(particle.defocus > 0) { particle.crash(PAState.CRASH_DEFOCUS); return; }
|
||||
if(this.power < this.usage) { particle.crash(PAState.CRASH_NOPOWER); return; }
|
||||
if(this.power < usage) { particle.crash(PAState.CRASH_NOPOWER); return; }
|
||||
if(!isCool()) { particle.crash(PAState.CRASH_NOCOOL); return; }
|
||||
this.power -= usage;
|
||||
|
||||
for(ParticleAcceleratorRecipe recipe : ParticleAcceleratorRecipes.recipes) {
|
||||
if(!recipe.matchesRecipe(particle.input1, particle.input2)) continue; // another W for continue
|
||||
|
||||
if(particle.momentum >= recipe.momentum &&
|
||||
((recipe.input1.matchesRecipe(particle.input1, true) && recipe.input2.matchesRecipe(particle.input2, true)) ||
|
||||
(recipe.input1.matchesRecipe(particle.input2, true) && recipe.input2.matchesRecipe(particle.input1, true)))) {
|
||||
if(canAccept(recipe)) {
|
||||
if(recipe.output1.getItem().hasContainerItem(recipe.output1)) this.decrStackSize(1, 1);
|
||||
if(recipe.output2 != null && recipe.output2.getItem().hasContainerItem(recipe.output2)) this.decrStackSize(2, 1);
|
||||
|
||||
if(slots[3] == null) {
|
||||
slots[3] = recipe.output1.copy();
|
||||
} else {
|
||||
slots[3].stackSize += recipe.output1.stackSize;
|
||||
}
|
||||
|
||||
if(recipe.output2 != null) {
|
||||
if(slots[4] == null) {
|
||||
slots[4] = recipe.output2.copy();
|
||||
} else {
|
||||
slots[4].stackSize += recipe.output2.stackSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
particle.crash(PAState.SUCCESS);
|
||||
if(particle.momentum < recipe.momentum) {
|
||||
particle.crash(PAState.CRASH_UNDERSPEED);
|
||||
return;
|
||||
}
|
||||
|
||||
if(canAccept(recipe)) {
|
||||
if(recipe.output1.getItem().hasContainerItem(recipe.output1)) this.decrStackSize(1, 1);
|
||||
if(recipe.output2 != null && recipe.output2.getItem().hasContainerItem(recipe.output2)) this.decrStackSize(2, 1);
|
||||
|
||||
if(slots[3] == null) {
|
||||
slots[3] = recipe.output1.copy();
|
||||
} else {
|
||||
slots[3].stackSize += recipe.output1.stackSize;
|
||||
}
|
||||
|
||||
if(recipe.output2 != null) {
|
||||
if(slots[4] == null) {
|
||||
slots[4] = recipe.output2.copy();
|
||||
} else {
|
||||
slots[4].stackSize += recipe.output2.stackSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
particle.crash(PAState.SUCCESS);
|
||||
return;
|
||||
}
|
||||
|
||||
particle.crash(PAState.CRASH_NORECIPE);
|
||||
}
|
||||
|
||||
|
||||
public boolean canAccept(ParticleAcceleratorRecipe recipe) {
|
||||
return checkSlot(recipe.output1, 1, 3) && checkSlot(recipe.output2, 2, 4);
|
||||
}
|
||||
|
||||
|
||||
public boolean checkSlot(ItemStack output, int containerSlot, int outputSlot) {
|
||||
if(output != null) {
|
||||
if(slots[outputSlot] != null) {
|
||||
@ -149,7 +165,7 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
||||
if(slots[containerSlot] == null || slots[containerSlot].getItem() != container.getItem() || slots[containerSlot].getItemDamage() != container.getItemDamage()) return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv
|
||||
|
||||
@Override
|
||||
public long getMaxPower() {
|
||||
return 5_000_000;
|
||||
return 2_500_000;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -70,8 +70,8 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv
|
||||
int mult = 1;
|
||||
if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) {
|
||||
type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage());
|
||||
if(type.diMin > particle.momentum) mult *= 5;
|
||||
if(type.diDistMin > particle.distanceTraveled) mult *= 5;
|
||||
if(type.diMin > particle.momentum) mult *= 10;
|
||||
if(type.diDistMin > particle.distanceTraveled) mult *= 10;
|
||||
}
|
||||
|
||||
if(!isCool()) particle.crash(PAState.CRASH_NOCOOL);
|
||||
|
||||
@ -31,7 +31,7 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI
|
||||
|
||||
@Override
|
||||
public long getMaxPower() {
|
||||
return 1_000_000;
|
||||
return 2_500_000;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -53,7 +53,7 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI
|
||||
int mult = 1;
|
||||
if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) {
|
||||
type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage());
|
||||
mult = type.quadMin > particle.momentum ? 5 : 1;
|
||||
mult = type.quadMin > particle.momentum ? 10 : 1;
|
||||
}
|
||||
|
||||
if(!isCool()) particle.crash(PAState.CRASH_NOCOOL);
|
||||
|
||||
@ -19,7 +19,7 @@ import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
public class TileEntityPARFC extends TileEntityCooledBase implements IGUIProvider, IParticleUser {
|
||||
|
||||
public static final long usage = 100_000;
|
||||
public static final long usage = 250_000;
|
||||
public static final int momentumGain = 100;
|
||||
public static final int defocusGain = 100;
|
||||
|
||||
|
||||
@ -25,16 +25,16 @@ import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
|
||||
public class TileEntityPASource extends TileEntityCooledBase implements IGUIProvider, IConditionalInvAccess, IControlReceiver {
|
||||
|
||||
|
||||
public static final long usage = 100_000;
|
||||
public Particle particle;
|
||||
public PAState state = PAState.IDLE;
|
||||
|
||||
|
||||
public int lastSpeed;
|
||||
|
||||
|
||||
public int debugSpeed;
|
||||
|
||||
public static enum PAState {
|
||||
|
||||
public enum PAState {
|
||||
IDLE(0x8080ff), //no particle active
|
||||
RUNNING(0xffff00), //running without further issue
|
||||
SUCCESS(0x00ff00), //completed recipe
|
||||
@ -45,17 +45,19 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
CRASH_NOCOOL(0xff0000), //crash due to lack of cooling
|
||||
CRASH_NOPOWER(0xff0000), //crash due to power outage
|
||||
CRASH_NOCOIL(0xff0000), //crash due to no coil installed (QP, DP)
|
||||
CRASH_OVERSPEED(0xff0000); //crash due to coil max speed exceeded (QP, DP)
|
||||
|
||||
public int color;
|
||||
|
||||
private PAState(int color) {
|
||||
CRASH_OVERSPEED(0xff0000), //crash due to coil max speed exceeded (QP, DP)
|
||||
CRASH_UNDERSPEED(0xff0000), //crash due to recipe momentum requirements not being met
|
||||
CRASH_NORECIPE(0xff0000); //crash due to failing to match recipe
|
||||
|
||||
public final int color;
|
||||
|
||||
PAState(int color) {
|
||||
this.color = color;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void updateState(PAState state) { this.state = state; }
|
||||
|
||||
|
||||
public TileEntityPASource() {
|
||||
super(5);
|
||||
}
|
||||
@ -65,10 +67,10 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
|
||||
@Override
|
||||
public void updateEntity() {
|
||||
|
||||
|
||||
if(!worldObj.isRemote) {
|
||||
this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower());
|
||||
|
||||
|
||||
for(int i = 0; i < 10; i++) {
|
||||
if(particle != null) {
|
||||
this.state = PAState.RUNNING;
|
||||
@ -81,14 +83,14 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
super.updateEntity();
|
||||
}
|
||||
|
||||
|
||||
public void steppy() {
|
||||
if(!worldObj.getChunkProvider().chunkExists(particle.x >> 4, particle.z >> 4)) { this.state = PAState.PAUSE_UNLOADED; return; } //halt if we reach unloaded areas
|
||||
//ExplosionSmallCreator.composeEffect(worldObj, particle.x + 0.5, particle.y + 0.5, particle.z + 0.5, 10, 1, 1);
|
||||
|
||||
|
||||
Block b = worldObj.getBlock(particle.x, particle.y, particle.z);
|
||||
if(b instanceof BlockDummyable) {
|
||||
int[] pos = ((BlockDummyable) b).findCore(worldObj, particle.x, particle.y, particle.z);
|
||||
@ -105,14 +107,14 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
particle.crash(PAState.CRASH_DERAIL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void tryRun() {
|
||||
if(slots[1].getItem().hasContainerItem(slots[1]) && slots[3] != null) return;
|
||||
if(slots[2].getItem().hasContainerItem(slots[2]) && slots[4] != null) return;
|
||||
|
||||
if(slots[1].getItem().hasContainerItem(slots[1])) slots[3] = slots[1].getItem().getContainerItem(slots[1]).copy();
|
||||
if(slots[2].getItem().hasContainerItem(slots[2])) slots[4] = slots[2].getItem().getContainerItem(slots[2]).copy();
|
||||
|
||||
|
||||
this.power -= usage;
|
||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
||||
ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN);
|
||||
@ -137,7 +139,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
state = EnumUtil.grabEnumSafely(PAState.class, buf.readByte());
|
||||
this.lastSpeed = buf.readInt();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public DirPos[] getConPos() {
|
||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
||||
@ -164,24 +166,24 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
|
||||
//reusing the same fucking instance because doing anything else would be retarded
|
||||
public static final BlockPos cheapAss = new BlockPos(0, 0, 0);
|
||||
public static final int[] slotsRed = new int[] {1};
|
||||
public static final int[] slotsYellow = new int[] {2};
|
||||
public static final int[] slotsRed = new int[] {1, 3, 4};
|
||||
public static final int[] slotsYellow = new int[] {2, 3, 4};
|
||||
@Override
|
||||
public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side) {
|
||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
||||
ForgeDirection rot = dir.getRotation(ForgeDirection.UP);
|
||||
cheapAss.mutate(x, y, z);
|
||||
|
||||
|
||||
if(cheapAss.compare(xCoord + dir.offsetX - rot.offsetX * 2, yCoord, zCoord + dir.offsetZ - rot.offsetZ * 2) ||
|
||||
cheapAss.compare(xCoord - dir.offsetX + rot.offsetX * 2, yCoord, zCoord - dir.offsetZ + rot.offsetZ * 2)) {
|
||||
return slotsYellow;
|
||||
}
|
||||
|
||||
|
||||
if(cheapAss.compare(xCoord - dir.offsetX - rot.offsetX * 2, yCoord, zCoord - dir.offsetZ - rot.offsetZ * 2) ||
|
||||
cheapAss.compare(xCoord + dir.offsetX + rot.offsetX * 2, yCoord, zCoord + dir.offsetZ + rot.offsetZ * 2)) {
|
||||
return slotsRed;
|
||||
}
|
||||
|
||||
|
||||
return getAccessibleSlotsFromSide(side);
|
||||
}
|
||||
|
||||
@ -191,10 +193,10 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
}
|
||||
|
||||
AxisAlignedBB bb = null;
|
||||
|
||||
|
||||
@Override
|
||||
public AxisAlignedBB getRenderBoundingBox() {
|
||||
|
||||
|
||||
if(bb == null) {
|
||||
bb = AxisAlignedBB.getBoundingBox(
|
||||
xCoord - 4,
|
||||
@ -205,10 +207,10 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
zCoord + 6
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
return bb;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public double getMaxRenderDistanceSquared() {
|
||||
@ -230,7 +232,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
this.state = PAState.IDLE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static class Particle {
|
||||
|
||||
private TileEntityPASource source;
|
||||
@ -243,10 +245,10 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
public int distanceTraveled;
|
||||
public static final int maxDefocus = 1000;
|
||||
public boolean invalid = false;
|
||||
|
||||
|
||||
public ItemStack input1;
|
||||
public ItemStack input2;
|
||||
|
||||
|
||||
public Particle(TileEntityPASource source, int x, int y, int z, ForgeDirection dir, ItemStack input1, ItemStack input2) {
|
||||
this.source = source;
|
||||
this.x = x;
|
||||
@ -256,27 +258,27 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
||||
this.input1 = input1;
|
||||
this.input2 = input2;
|
||||
}
|
||||
|
||||
|
||||
public void crash(PAState state) {
|
||||
this.invalid = true;
|
||||
this.source.updateState(state);
|
||||
}
|
||||
|
||||
|
||||
public void move(BlockPos pos) {
|
||||
this.x = pos.getX();
|
||||
this.y = pos.getY();
|
||||
this.z = pos.getZ();
|
||||
this.source.lastSpeed = this.momentum;
|
||||
}
|
||||
|
||||
|
||||
public void addDistance(int dist) { this.distanceTraveled += dist; }
|
||||
public void resetDistance() { this.distanceTraveled = 0; }
|
||||
|
||||
|
||||
public void defocus(int amount) {
|
||||
this.defocus += amount;
|
||||
if(this.defocus > this.maxDefocus) this.crash(PAState.CRASH_DEFOCUS);
|
||||
}
|
||||
|
||||
|
||||
public void focus(int amount) {
|
||||
this.defocus -= amount;
|
||||
if(this.defocus < 0) this.defocus = 0;
|
||||
|
||||
39
src/main/java/com/hbm/uninos/GenNode.java
Normal file
39
src/main/java/com/hbm/uninos/GenNode.java
Normal file
@ -0,0 +1,39 @@
|
||||
package com.hbm.uninos;
|
||||
|
||||
import com.hbm.util.fauxpointtwelve.BlockPos;
|
||||
import com.hbm.util.fauxpointtwelve.DirPos;
|
||||
|
||||
public class GenNode<T> {
|
||||
|
||||
public BlockPos[] positions;
|
||||
public DirPos[] connections;
|
||||
public INodeNet<T> net;
|
||||
public boolean expired = false;
|
||||
public boolean recentlyChanged = true;
|
||||
|
||||
public GenNode(BlockPos... positions) {
|
||||
this.positions = positions;
|
||||
}
|
||||
|
||||
public GenNode<T> setConnections(DirPos... connections) {
|
||||
this.connections = connections;
|
||||
return this;
|
||||
}
|
||||
|
||||
public GenNode<T> addConnection(DirPos connection) {
|
||||
DirPos[] newCons = new DirPos[this.connections.length + 1];
|
||||
for(int i = 0; i < this.connections.length; i++) newCons[i] = this.connections[i];
|
||||
newCons[newCons.length - 1] = connection;
|
||||
this.connections = newCons;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean hasValidNet() {
|
||||
return this.net != null && this.net.isValid();
|
||||
}
|
||||
|
||||
public void setNet(INodeNet<T> net) {
|
||||
this.net = net;
|
||||
this.recentlyChanged = true;
|
||||
}
|
||||
}
|
||||
29
src/main/java/com/hbm/uninos/GenNodeWorld.java
Normal file
29
src/main/java/com/hbm/uninos/GenNodeWorld.java
Normal file
@ -0,0 +1,29 @@
|
||||
package com.hbm.uninos;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.hbm.util.fauxpointtwelve.BlockPos;
|
||||
|
||||
public class GenNodeWorld<T> {
|
||||
|
||||
public HashMap<BlockPos, GenNode<T>> nodes = new HashMap();
|
||||
|
||||
public void pushNode(GenNode<T> node) {
|
||||
for(BlockPos pos : node.positions) {
|
||||
nodes.put(pos, node);
|
||||
}
|
||||
}
|
||||
|
||||
public void popNode(GenNode<T> node) {
|
||||
if(node.net != null) node.net.destroy();
|
||||
for(BlockPos pos : node.positions) {
|
||||
nodes.remove(pos);
|
||||
node.expired = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void popNode(BlockPos pos) {
|
||||
GenNode<T> node = nodes.get(pos);
|
||||
if(node != null) popNode(node);
|
||||
}
|
||||
}
|
||||
34
src/main/java/com/hbm/uninos/GenNodespace.java
Normal file
34
src/main/java/com/hbm/uninos/GenNodespace.java
Normal file
@ -0,0 +1,34 @@
|
||||
package com.hbm.uninos;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.hbm.util.fauxpointtwelve.BlockPos;
|
||||
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class GenNodespace<T> {
|
||||
|
||||
public HashMap<World, GenNodeWorld<T>> worlds = new HashMap<>();
|
||||
|
||||
public GenNode<T> getNode(World world, int x, int y, int z) {
|
||||
GenNodeWorld nodeWorld = worlds.get(world);
|
||||
if(nodeWorld != null) return (GenNode<T>) nodeWorld.nodes.get(new BlockPos(x, y, z));
|
||||
return null;
|
||||
}
|
||||
|
||||
public void createNode(World world, GenNode<T> node) {
|
||||
GenNodeWorld nodeWorld = worlds.get(world);
|
||||
if(nodeWorld == null) {
|
||||
nodeWorld = new GenNodeWorld();
|
||||
worlds.put(world, nodeWorld);
|
||||
}
|
||||
nodeWorld.pushNode(node);
|
||||
}
|
||||
|
||||
public void destroyNode(World world, int x, int y, int z) {
|
||||
GenNode<T> node = getNode(world, x, y, z);
|
||||
if(node != null) {
|
||||
worlds.get(world).popNode(node);
|
||||
}
|
||||
}
|
||||
}
|
||||
5
src/main/java/com/hbm/uninos/INetworkProvider.java
Normal file
5
src/main/java/com/hbm/uninos/INetworkProvider.java
Normal file
@ -0,0 +1,5 @@
|
||||
package com.hbm.uninos;
|
||||
|
||||
public interface INetworkProvider {
|
||||
|
||||
}
|
||||
7
src/main/java/com/hbm/uninos/INodeNet.java
Normal file
7
src/main/java/com/hbm/uninos/INodeNet.java
Normal file
@ -0,0 +1,7 @@
|
||||
package com.hbm.uninos;
|
||||
|
||||
public interface INodeNet<T> {
|
||||
|
||||
public boolean isValid();
|
||||
public void destroy();
|
||||
}
|
||||
8
src/main/java/com/hbm/uninos/UniNodespace.java
Normal file
8
src/main/java/com/hbm/uninos/UniNodespace.java
Normal file
@ -0,0 +1,8 @@
|
||||
package com.hbm.uninos;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class UniNodespace {
|
||||
|
||||
public static HashMap<INetworkProvider, GenNodespace> nodespaces = new HashMap();
|
||||
}
|
||||
@ -39,4 +39,7 @@ public net.minecraft.world.gen.ChunkProviderServer field_73248_b # ch
|
||||
public net.minecraft.client.renderer.ItemRenderer field_78453_b # itemToRender
|
||||
|
||||
# AbstractResourcePack
|
||||
public net.minecraft.client.resources.AbstractResourcePack field_110597_b # resourcePackFile
|
||||
public net.minecraft.client.resources.AbstractResourcePack field_110597_b # resourcePackFile
|
||||
|
||||
# Container
|
||||
public net.minecraft.inventory.Container * # fucking everything i hate this class
|
||||
@ -1197,11 +1197,13 @@ item.ammo_shell.name=240mm Geschoss
|
||||
item.ammo_shell_apfsds_du.name=240mm APFSDS-DU
|
||||
item.ammo_shell_apfsds_t.name=240mm APFSDS-T
|
||||
item.ammo_shell_explosive.name=240mm HE-Geschoss
|
||||
item.ammo_shell_w9.name=240mm W9-Atomgeschoss
|
||||
item.ammo_secret.bmg50_equestrian.name=.50 BMG Zerstörer
|
||||
item.ammo_secret.folly_nuke.name=Silberne Kugel, Atomar
|
||||
item.ammo_secret.folly_sm.name=Silberne Kugel
|
||||
item.ammo_secret.g12_equestrian.name=Kaliber 12 Gleisnägel
|
||||
item.ammo_secret.m44_equestrian.name=.44 Magnum Schädelsprenger
|
||||
item.ammo_secret.p35_800.name=.35-800 V9
|
||||
item.ammo_standard.b75.name=.75 Bolzen
|
||||
item.ammo_standard.b75_exp.name=.75 Bolzen (Explosiv)
|
||||
item.ammo_standard.b75_inc.name=.75 Bolzen (Brand)
|
||||
@ -2197,6 +2199,7 @@ item.grenade_smart.name=Smart-Granate
|
||||
item.grenade_strong.name=Verbesserte Handgranate
|
||||
item.grenade_tau.name=Taugranate
|
||||
item.grenade_zomg.name=Negativenergie-Paarvernichtungsgranate
|
||||
item.gun_aberrator.name=Aberrator
|
||||
item.gun_am180.name=Schallgedämpfte Maschinenpistole
|
||||
item.gun_ar15.name=Josh
|
||||
item.gun_autoshotgun.name=Auto-Flinte
|
||||
|
||||
@ -1927,6 +1927,7 @@ item.ammo_secret.folly_nuke.name=Silver Bullet, Nuclear
|
||||
item.ammo_secret.folly_sm.name=Silver Bullet
|
||||
item.ammo_secret.g12_equestrian.name=12 Gauge Railway Spike Shot
|
||||
item.ammo_secret.m44_equestrian.name=.44 Magnum Head-Exploder
|
||||
item.ammo_secret.p35_800.name=.35-800 V9
|
||||
item.ammo_standard.b75.name=.75 Bolt
|
||||
item.ammo_standard.b75_exp.name=.75 Bolt (Explosive)
|
||||
item.ammo_standard.b75_inc.name=.75 Bolt (Incendiary)
|
||||
@ -3005,6 +3006,7 @@ item.grenade_tau.name=Tau Grenade
|
||||
item.grenade_zomg.name=Negative Energy Pair Annihilation Grenade
|
||||
item.glyphid_gland.name= Gland
|
||||
item.glyphid_gland_empty.name= Glyphid's Fluid Gland
|
||||
item.gun_aberrator.name=Aberrator
|
||||
item.gun_am180.name=Silenced Submachine Gun
|
||||
item.gun_ar15.name=Josh
|
||||
item.gun_autoshotgun.name=Auto Shotgun
|
||||
@ -4865,6 +4867,10 @@ pa.crash_nocoil=No coils!
|
||||
pa.crash_nocoil.desc=The particle has entered a dipole$or quadrupole which lacks coils.$Install coils to allow this part to work.
|
||||
pa.crash_overspeed=Overspeed!
|
||||
pa.crash_overspeed.desc=The particle has entered a dipole$or quadrupole, while its speed exceeded$the coil's rating. Install higher$tier coils, or configure the dipoles$to leave the accelerator ring sooner.
|
||||
pa.crash_norecipe=No recipe!
|
||||
pa.crash_norecipe.desc=The particle entered a detector$with an invalid set of inputs.$Ensure the particle source inputs$match a valid recipe.
|
||||
pa.crash_underspeed=Underspeed!
|
||||
pa.crash_underspeed.desc=The particle entered a detector$with insufficient speed to perform$the current recipe. Ensure the$accelerator is configured$correctly for the recipe.
|
||||
|
||||
potion.hbm_bang=! ! !
|
||||
potion.hbm_death=Astolfization
|
||||
|
||||
@ -1397,9 +1397,9 @@ hbmfluid.oil_ds=脱硫原油
|
||||
hbmfluid.oxygen=液氧
|
||||
hbmfluid.oxyhydrogen=氢氧混合气
|
||||
hbmfluid.pain=Pn(III) 钽铁溶液
|
||||
hbmfluid.perfluoromethyl=三氟碘甲烷
|
||||
hbmfluid.perfluoromethyl_cold=冷三氟碘甲烷
|
||||
hbmfluid.perfluoromethyl_hot=热三氟碘甲烷
|
||||
hbmfluid.perfluoromethyl=四氟甲烷
|
||||
hbmfluid.perfluoromethyl_cold=冷四氟甲烷
|
||||
hbmfluid.perfluoromethyl_hot=热四氟甲烷
|
||||
hbmfluid.peroxide=过氧化氢
|
||||
hbmfluid.petroil=汽油
|
||||
hbmfluid.petroil_leaded=含铅石油
|
||||
@ -6154,4 +6154,33 @@ desc.gui.upgrade.afterburner=*§d加力燃烧§r:堆叠至3级
|
||||
desc.gui.upgrade.effectiveness=*§a效率§r:堆叠至3级
|
||||
desc.gui.upgrade.overdrive=*§7超速§r:堆叠至3级
|
||||
desc.gui.upgrade.power=*§1节能§r:堆叠至3级
|
||||
desc.gui.upgrade.speed=*§4速度§r:堆叠至3级
|
||||
desc.gui.upgrade.speed=*§4速度§r:堆叠至3级
|
||||
container.paDetector=粒子探测器
|
||||
container.paDipole=双极磁铁
|
||||
container.paQuadrupole=四极磁铁
|
||||
container.paSource=粒子源
|
||||
hbmfluid.alumina=氧化铝
|
||||
hbmfluid.bauxite_solution=铝土矿溶液
|
||||
hbmfluid.lye=碱液
|
||||
hbmfluid.sodium_aluminate=偏铝酸钠
|
||||
hbmmat.bauxite=铝土矿
|
||||
hbmmat.cryolite=冰晶石
|
||||
item.chunk_ore.cryolite.name=冰晶石块
|
||||
item.pa_coil.chlorophyte.name=大型叶绿线圈
|
||||
pa.idle.desc=空闲
|
||||
pa.running.desc=正在运行
|
||||
pa.success.desc=成功
|
||||
pa.pause_unloaded.desc=粒子进入了未加载的区块。$在粒子与粒子源均被加载前,运行将暂停。
|
||||
pa.crash_defocus.desc=粒子失去焦距。$请确保加速器含有足够数量的四极磁铁。
|
||||
pa.crash_derail.desc=粒子离开加速器。$请确保加速器未缺失部件,$且所有双极磁铁均正确配置。
|
||||
pa.crash_cannot_enter.desc=粒子尝试进入加速器某部件时失败。$请确保所有部件朝向正确。
|
||||
pa.crash_nocool.desc=粒子进入了未冷却的加速器部件。$请确保所有需冷却的部件正常连接,且内部含有冷四氟甲烷。
|
||||
pa.crash_nopower.desc=粒子进入了未供能的加速器部件。$请确保所有部件均接受供电且供电充足。
|
||||
pa.crash_nocoil.desc=粒子进入了缺少线圈的双极磁铁或四极磁铁。$请安装线圈,以使上述部件正常工作。
|
||||
pa.crash_overspeed.desc=粒子进入某双极磁铁或四极磁铁时,$其速度超出了内部线圈接受的最大速度。$请安装更高等级的线圈,$或调整双极磁铁设定以使粒子提前离开加速区域。
|
||||
tile.pa_beamline.desc=可选部件,用于连接不同加速器部件$也可用于低成本地扩大粒子加速器尺寸,以达到双极磁铁的尺寸需求
|
||||
tile.pa_detector.desc=需要冷却!$接收粒子并进行配方$配方可能需要容器(粒子胶囊)$粒子的失焦程度需要为0才能被接收
|
||||
tile.pa_dipole.desc=需要冷却!$根据粒子动量使其转向$具有“低于阈值”、“高于阈值”、$“高于阈值且收到红石信号”三种设置$需要大型线圈才能工作
|
||||
tile.pa_quadrupole.desc=需要冷却!$使粒子失焦程度减少100$需要大型线圈才能工作
|
||||
tile.pa_rfc.desc=需要冷却!$使粒子动量增加100,并使粒子失焦程度增加100$粒子失焦程度到达1000时会坍毁
|
||||
tile.pa_source.desc=需要冷却!$使用两个物品来创造一个粒子
|
||||
|
||||
@ -249,6 +249,7 @@
|
||||
"weapon.fire.greaseGun": {"category": "player", "sounds": ["weapon/fire/greaseGun"]},
|
||||
"weapon.fire.uzi": {"category": "player", "sounds": ["weapon/fire/uzi"]},
|
||||
"weapon.fire.tesla": {"category": "player", "sounds": ["weapon/fire/tesla"]},
|
||||
"weapon.fire.aberrator": {"category": "player", "sounds": ["weapon/fire/aberrator"]},
|
||||
|
||||
"weapon.reload.boltClose": {"category": "player", "sounds": ["weapon/reload/boltClose"]},
|
||||
"weapon.reload.boltOpen": {"category": "player", "sounds": ["weapon/reload/boltOpen"]},
|
||||
|
||||
BIN
src/main/resources/assets/hbm/sounds/weapon/fire/aberrator.ogg
Normal file
BIN
src/main/resources/assets/hbm/sounds/weapon/fire/aberrator.ogg
Normal file
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 2.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
6187
zh_CN.lang
Normal file
6187
zh_CN.lang
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user