Merge branch 'master' into moige

This commit is contained in:
George Paton 2025-02-09 18:39:57 +11:00
commit 4fb7df8b3e
46 changed files with 7378 additions and 126 deletions

47
.github/workflows/build.yml vendored Normal file
View 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

View File

@ -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

View File

@ -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),\

View File

@ -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 });

View File

@ -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

View 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;
}
}

View 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;
}
}

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;
}
}
}

View File

@ -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());

View File

@ -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!");
}
}

View File

@ -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
}
}

View File

@ -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);

View File

@ -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) {

View File

@ -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);
}
};
}

View File

@ -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;
};
}

View File

@ -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

View File

@ -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 });

View File

@ -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

View File

@ -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());

View File

@ -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");

View File

@ -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);
}
}
}

View File

@ -121,7 +121,6 @@ public class ItemRenderGreasegun extends ItemRenderWeaponBase {
public void setupThirdPerson(ItemStack stack) {
super.setupThirdPerson(stack);
GL11.glTranslated(0, 1, 3);
}
@Override

View File

@ -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();

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View 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;
}
}

View 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);
}
}

View 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);
}
}
}

View File

@ -0,0 +1,5 @@
package com.hbm.uninos;
public interface INetworkProvider {
}

View File

@ -0,0 +1,7 @@
package com.hbm.uninos;
public interface INodeNet<T> {
public boolean isValid();
public void destroy();
}

View File

@ -0,0 +1,8 @@
package com.hbm.uninos;
import java.util.HashMap;
public class UniNodespace {
public static HashMap<INetworkProvider, GenNodespace> nodespaces = new HashMap();
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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=需要冷却!$使用两个物品来创造一个粒子

View File

@ -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"]},

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

File diff suppressed because it is too large Load Diff