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
|
## Changed
|
||||||
* Blast doors will now pulverize any block that gets in their way during closing
|
* Particle detectors now print an error for when the recipe could not be completed
|
||||||
* 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
|
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
* Fixed the CCGT's steam output breaking as soon as the steam buffer runs full
|
* Fixed items being annihilated when shift clicking them into the particle source
|
||||||
* Fixed crash caused by mobs holding belt-fed guns
|
* Fixed packet optimization not allowing packets to be sent when the day night cycle is halted
|
||||||
* Fixed boiler heat input being way too low due to operation order (diffusion was applied AFTER the input heat was capped)
|
* Fixed particle detectors not always using power when they should
|
||||||
* Fixed stinger playing its lockon sound on the wrong side
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
mod_version=1.0.27
|
mod_version=1.0.27
|
||||||
# Empty build number makes a release type
|
# Empty build number makes a release type
|
||||||
mod_build_number=5229
|
mod_build_number=5230
|
||||||
|
|
||||||
credits=HbMinecraft,\
|
credits=HbMinecraft,\
|
||||||
\ rodolphito (explosion algorithms),\
|
\ rodolphito (explosion algorithms),\
|
||||||
@ -39,6 +39,7 @@ credits=HbMinecraft,\
|
|||||||
\ Nos (models),\
|
\ Nos (models),\
|
||||||
\ Minecreep (models),\
|
\ Minecreep (models),\
|
||||||
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes, cryolite),\
|
\ 70k (textures, glyphid AI, strand caster, electrolyzer changes, cryolite),\
|
||||||
|
\ instantnootles (concept artist),\
|
||||||
\ haru315 (spiral point algorithm),\
|
\ haru315 (spiral point algorithm),\
|
||||||
\ Sten89 (models),\
|
\ Sten89 (models),\
|
||||||
\ Pixelguru26 (textures),\
|
\ 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_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_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.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_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_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 });
|
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.inventory.fluid.trait.FT_Heatable.HeatingType;
|
||||||
import com.hbm.items.machine.ItemFluidIcon;
|
import com.hbm.items.machine.ItemFluidIcon;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
public class BoilingHandler extends NEIUniversalHandler {
|
public class BoilingHandler extends NEIUniversalHandler {
|
||||||
|
|
||||||
public BoilingHandler() {
|
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
|
@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.inventory.SlotTakeOnly;
|
||||||
import com.hbm.items.ModItems;
|
import com.hbm.items.ModItems;
|
||||||
import com.hbm.tileentity.machine.albion.TileEntityPASource;
|
import com.hbm.tileentity.machine.albion.TileEntityPASource;
|
||||||
|
import com.hbm.util.InventoryUtil;
|
||||||
|
|
||||||
import api.hbm.energymk2.IBatteryItem;
|
import api.hbm.energymk2.IBatteryItem;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@ -59,9 +60,9 @@ public class ContainerPASource extends Container {
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) {
|
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 {
|
} else {
|
||||||
if(!this.mergeItemStack(stack, 1, 3, false)) return null;
|
if(!InventoryUtil.mergeItemStack(this.inventorySlots, stack, 1, 3, false)) return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -136,6 +136,12 @@ public class ParticleAcceleratorRecipes extends SerializableRecipe {
|
|||||||
this.output1 = out1;
|
this.output1 = out1;
|
||||||
this.output2 = out2;
|
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
|
@Override
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.hbm.items;
|
package com.hbm.items;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@ -14,6 +15,7 @@ import net.minecraft.item.EnumRarity;
|
|||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.EnumChatFormatting;
|
import net.minecraft.util.EnumChatFormatting;
|
||||||
|
import net.minecraft.util.StatCollector;
|
||||||
|
|
||||||
public class ItemCustomLore extends Item {
|
public class ItemCustomLore extends Item {
|
||||||
|
|
||||||
@ -104,4 +106,121 @@ public class ItemCustomLore extends Item {
|
|||||||
setTextureName(RefStrings.MODID + ':' + uloc);
|
setTextureName(RefStrings.MODID + ':' + uloc);
|
||||||
return super.setUnlocalizedName(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_hangman;
|
||||||
public static Item gun_bolter;
|
public static Item gun_bolter;
|
||||||
public static Item gun_folly;
|
public static Item gun_folly;
|
||||||
|
public static Item gun_aberrator;
|
||||||
public static Item gun_double_barrel;
|
public static Item gun_double_barrel;
|
||||||
public static Item gun_double_barrel_sacred_dragon;
|
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_hangman, gun_hangman.getUnlocalizedName());
|
||||||
GameRegistry.registerItem(gun_bolter, gun_bolter.getUnlocalizedName());
|
GameRegistry.registerItem(gun_bolter, gun_bolter.getUnlocalizedName());
|
||||||
GameRegistry.registerItem(gun_folly, gun_folly.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, gun_double_barrel.getUnlocalizedName());
|
||||||
GameRegistry.registerItem(gun_double_barrel_sacred_dragon, gun_double_barrel_sacred_dragon.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.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 + "Minimums not met result in a power draw penalty!");
|
||||||
list.add(EnumChatFormatting.RED + "Maximums exceeded result in the particle crashing!");
|
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();
|
XFactoryFolly.init();
|
||||||
XFactoryTurret.init();
|
XFactoryTurret.init();
|
||||||
XFactory10ga.init();
|
XFactory10ga.init();
|
||||||
|
XFactory35800.init();
|
||||||
|
|
||||||
/// PROXY BULLSHIT ///
|
/// PROXY BULLSHIT ///
|
||||||
MainRegistry.proxy.registerGunCfg();
|
MainRegistry.proxy.registerGunCfg();
|
||||||
@ -124,6 +125,7 @@ public class GunFactory {
|
|||||||
|
|
||||||
public static enum EnumAmmoSecret {
|
public static enum EnumAmmoSecret {
|
||||||
FOLLY_SM, FOLLY_NUKE,
|
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.XFactory12ga.*;
|
||||||
import static com.hbm.items.weapon.sedna.factory.XFactory22lr.*;
|
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.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.XFactory40mm.*;
|
||||||
import static com.hbm.items.weapon.sedna.factory.XFactory44.*;
|
import static com.hbm.items.weapon.sedna.factory.XFactory44.*;
|
||||||
import static com.hbm.items.weapon.sedna.factory.XFactory50.*;
|
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_hangman, new ItemRenderHangman());
|
||||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter());
|
MinecraftForgeClient.registerItemRenderer(ModItems.gun_bolter, new ItemRenderBolter());
|
||||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_folly, new ItemRenderFolly());
|
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, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_tex));
|
||||||
MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex));
|
MinecraftForgeClient.registerItemRenderer(ModItems.gun_double_barrel_sacred_dragon, new ItemRenderDoubleBarrel(ResourceManager.double_barrel_sacred_dragon_tex));
|
||||||
//PROJECTILES
|
//PROJECTILES
|
||||||
@ -190,6 +192,8 @@ public class GunFactoryClient {
|
|||||||
folly_sm.setRendererBeam(LegoClient.RENDER_FOLLY);
|
folly_sm.setRendererBeam(LegoClient.RENDER_FOLLY);
|
||||||
folly_nuke.setRenderer(LegoClient.RENDER_BIG_NUKE);
|
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
|
setRendererBulk(LegoClient.RENDER_GRENADE, shell_normal, shell_explosive, shell_ap, shell_du, shell_w9); //TODO: change the sabots
|
||||||
|
|
||||||
//HUDS
|
//HUDS
|
||||||
@ -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_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_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_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) .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);
|
((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) -> {
|
public static BiConsumer<EntityBulletBeamBase, Float> RENDER_LASER_PURPLE = (bullet, interp) -> {
|
||||||
renderStandardLaser(bullet, interp, 0x60, 0x15, 0x80);
|
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) {
|
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);
|
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 class RefStrings {
|
||||||
public static final String MODID = "hbm";
|
public static final String MODID = "hbm";
|
||||||
public static final String NAME = "Hbm's Nuclear Tech Mod";
|
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:
|
//HBM's Beta Naming Convention:
|
||||||
//V T (X)
|
//V T (X)
|
||||||
//V -> next release version
|
//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_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.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_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.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 });
|
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.GUIArmorTable;
|
||||||
import com.hbm.inventory.gui.GUIScreenPreview;
|
import com.hbm.inventory.gui.GUIScreenPreview;
|
||||||
import com.hbm.inventory.gui.GUIScreenWikiRender;
|
import com.hbm.inventory.gui.GUIScreenWikiRender;
|
||||||
|
import com.hbm.items.ItemCustomLore;
|
||||||
import com.hbm.items.ModItems;
|
import com.hbm.items.ModItems;
|
||||||
import com.hbm.items.armor.*;
|
import com.hbm.items.armor.*;
|
||||||
import com.hbm.items.machine.ItemDepletedFuel;
|
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));
|
client.sendQueue.addToSendQueue(new C0CPacketInput(client.moveStrafing, client.moveForward, client.movementInput.jump, client.movementInput.sneak));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(event.phase == event.phase.END) ItemCustomLore.updateSystem();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
|||||||
@ -70,6 +70,7 @@ public class NEIRegistry {
|
|||||||
handlers.add(new AmmoPressHandler());
|
handlers.add(new AmmoPressHandler());
|
||||||
handlers.add(new CompressorHandler());
|
handlers.add(new CompressorHandler());
|
||||||
handlers.add(new ParticleAcceleratorHandler());
|
handlers.add(new ParticleAcceleratorHandler());
|
||||||
|
handlers.add(new DeuteriumHandler());
|
||||||
|
|
||||||
//this shit comes last
|
//this shit comes last
|
||||||
handlers.add(new FluidRecipeHandler());
|
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 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 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 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> 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"));
|
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 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_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 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");
|
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) {
|
public void setupThirdPerson(ItemStack stack) {
|
||||||
super.setupThirdPerson(stack);
|
super.setupThirdPerson(stack);
|
||||||
GL11.glTranslated(0, 1, 3);
|
GL11.glTranslated(0, 1, 3);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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.
|
// 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(),
|
// I think it might be fixable by doing something with getDescriptionPacket() and onDataPacket(),
|
||||||
// but this sidesteps the problem for the mean time.
|
// 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();
|
this.lastPackedBuf = preBuf.copy();
|
||||||
|
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import com.hbm.inventory.container.ContainerPADetector;
|
|||||||
import com.hbm.inventory.gui.GUIPADetector;
|
import com.hbm.inventory.gui.GUIPADetector;
|
||||||
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes;
|
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes;
|
||||||
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe;
|
import com.hbm.inventory.recipes.ParticleAcceleratorRecipes.ParticleAcceleratorRecipe;
|
||||||
|
import com.hbm.lib.Library;
|
||||||
import com.hbm.tileentity.IGUIProvider;
|
import com.hbm.tileentity.IGUIProvider;
|
||||||
import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState;
|
import com.hbm.tileentity.machine.albion.TileEntityPASource.PAState;
|
||||||
import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle;
|
import com.hbm.tileentity.machine.albion.TileEntityPASource.Particle;
|
||||||
@ -32,6 +33,16 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
|||||||
return "container.paDetector";
|
return "container.paDetector";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateEntity() {
|
||||||
|
|
||||||
|
if(!worldObj.isRemote) {
|
||||||
|
this.power = Library.chargeTEFromItems(slots, 0, power, this.getMaxPower());
|
||||||
|
}
|
||||||
|
|
||||||
|
super.updateEntity();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DirPos[] getConPos() {
|
public DirPos[] getConPos() {
|
||||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
||||||
@ -101,36 +112,41 @@ public class TileEntityPADetector extends TileEntityCooledBase implements IGUIPr
|
|||||||
particle.invalid = true;
|
particle.invalid = true;
|
||||||
//particle will crash if not perfectly focused
|
//particle will crash if not perfectly focused
|
||||||
if(particle.defocus > 0) { particle.crash(PAState.CRASH_DEFOCUS); return; }
|
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; }
|
if(!isCool()) { particle.crash(PAState.CRASH_NOCOOL); return; }
|
||||||
|
this.power -= usage;
|
||||||
|
|
||||||
for(ParticleAcceleratorRecipe recipe : ParticleAcceleratorRecipes.recipes) {
|
for(ParticleAcceleratorRecipe recipe : ParticleAcceleratorRecipes.recipes) {
|
||||||
|
if(!recipe.matchesRecipe(particle.input1, particle.input2)) continue; // another W for continue
|
||||||
|
|
||||||
if(particle.momentum >= recipe.momentum &&
|
if(particle.momentum < recipe.momentum) {
|
||||||
((recipe.input1.matchesRecipe(particle.input1, true) && recipe.input2.matchesRecipe(particle.input2, true)) ||
|
particle.crash(PAState.CRASH_UNDERSPEED);
|
||||||
(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);
|
|
||||||
return;
|
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) {
|
public boolean canAccept(ParticleAcceleratorRecipe recipe) {
|
||||||
|
|||||||
@ -40,7 +40,7 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMaxPower() {
|
public long getMaxPower() {
|
||||||
return 5_000_000;
|
return 2_500_000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -70,8 +70,8 @@ public class TileEntityPADipole extends TileEntityCooledBase implements IGUIProv
|
|||||||
int mult = 1;
|
int mult = 1;
|
||||||
if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) {
|
if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) {
|
||||||
type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage());
|
type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage());
|
||||||
if(type.diMin > particle.momentum) mult *= 5;
|
if(type.diMin > particle.momentum) mult *= 10;
|
||||||
if(type.diDistMin > particle.distanceTraveled) mult *= 5;
|
if(type.diDistMin > particle.distanceTraveled) mult *= 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isCool()) particle.crash(PAState.CRASH_NOCOOL);
|
if(!isCool()) particle.crash(PAState.CRASH_NOCOOL);
|
||||||
|
|||||||
@ -31,7 +31,7 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getMaxPower() {
|
public long getMaxPower() {
|
||||||
return 1_000_000;
|
return 2_500_000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -53,7 +53,7 @@ public class TileEntityPAQuadrupole extends TileEntityCooledBase implements IGUI
|
|||||||
int mult = 1;
|
int mult = 1;
|
||||||
if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) {
|
if(slots[1] != null && slots[1].getItem() == ModItems.pa_coil) {
|
||||||
type = EnumUtil.grabEnumSafely(EnumCoilType.class, slots[1].getItemDamage());
|
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);
|
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 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 momentumGain = 100;
|
||||||
public static final int defocusGain = 100;
|
public static final int defocusGain = 100;
|
||||||
|
|
||||||
|
|||||||
@ -34,7 +34,7 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
|||||||
|
|
||||||
public int debugSpeed;
|
public int debugSpeed;
|
||||||
|
|
||||||
public static enum PAState {
|
public enum PAState {
|
||||||
IDLE(0x8080ff), //no particle active
|
IDLE(0x8080ff), //no particle active
|
||||||
RUNNING(0xffff00), //running without further issue
|
RUNNING(0xffff00), //running without further issue
|
||||||
SUCCESS(0x00ff00), //completed recipe
|
SUCCESS(0x00ff00), //completed recipe
|
||||||
@ -45,11 +45,13 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
|||||||
CRASH_NOCOOL(0xff0000), //crash due to lack of cooling
|
CRASH_NOCOOL(0xff0000), //crash due to lack of cooling
|
||||||
CRASH_NOPOWER(0xff0000), //crash due to power outage
|
CRASH_NOPOWER(0xff0000), //crash due to power outage
|
||||||
CRASH_NOCOIL(0xff0000), //crash due to no coil installed (QP, DP)
|
CRASH_NOCOIL(0xff0000), //crash due to no coil installed (QP, DP)
|
||||||
CRASH_OVERSPEED(0xff0000); //crash due to coil max speed exceeded (QP, DP)
|
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 int color;
|
public final int color;
|
||||||
|
|
||||||
private PAState(int color) {
|
PAState(int color) {
|
||||||
this.color = color;
|
this.color = color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,8 +166,8 @@ public class TileEntityPASource extends TileEntityCooledBase implements IGUIProv
|
|||||||
|
|
||||||
//reusing the same fucking instance because doing anything else would be retarded
|
//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 BlockPos cheapAss = new BlockPos(0, 0, 0);
|
||||||
public static final int[] slotsRed = new int[] {1};
|
public static final int[] slotsRed = new int[] {1, 3, 4};
|
||||||
public static final int[] slotsYellow = new int[] {2};
|
public static final int[] slotsYellow = new int[] {2, 3, 4};
|
||||||
@Override
|
@Override
|
||||||
public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side) {
|
public int[] getAccessibleSlotsFromSide(int x, int y, int z, int side) {
|
||||||
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10);
|
||||||
|
|||||||
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();
|
||||||
|
}
|
||||||
@ -40,3 +40,6 @@ public net.minecraft.client.renderer.ItemRenderer field_78453_b # it
|
|||||||
|
|
||||||
# AbstractResourcePack
|
# 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_du.name=240mm APFSDS-DU
|
||||||
item.ammo_shell_apfsds_t.name=240mm APFSDS-T
|
item.ammo_shell_apfsds_t.name=240mm APFSDS-T
|
||||||
item.ammo_shell_explosive.name=240mm HE-Geschoss
|
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.bmg50_equestrian.name=.50 BMG Zerstörer
|
||||||
item.ammo_secret.folly_nuke.name=Silberne Kugel, Atomar
|
item.ammo_secret.folly_nuke.name=Silberne Kugel, Atomar
|
||||||
item.ammo_secret.folly_sm.name=Silberne Kugel
|
item.ammo_secret.folly_sm.name=Silberne Kugel
|
||||||
item.ammo_secret.g12_equestrian.name=Kaliber 12 Gleisnägel
|
item.ammo_secret.g12_equestrian.name=Kaliber 12 Gleisnägel
|
||||||
item.ammo_secret.m44_equestrian.name=.44 Magnum Schädelsprenger
|
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.name=.75 Bolzen
|
||||||
item.ammo_standard.b75_exp.name=.75 Bolzen (Explosiv)
|
item.ammo_standard.b75_exp.name=.75 Bolzen (Explosiv)
|
||||||
item.ammo_standard.b75_inc.name=.75 Bolzen (Brand)
|
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_strong.name=Verbesserte Handgranate
|
||||||
item.grenade_tau.name=Taugranate
|
item.grenade_tau.name=Taugranate
|
||||||
item.grenade_zomg.name=Negativenergie-Paarvernichtungsgranate
|
item.grenade_zomg.name=Negativenergie-Paarvernichtungsgranate
|
||||||
|
item.gun_aberrator.name=Aberrator
|
||||||
item.gun_am180.name=Schallgedämpfte Maschinenpistole
|
item.gun_am180.name=Schallgedämpfte Maschinenpistole
|
||||||
item.gun_ar15.name=Josh
|
item.gun_ar15.name=Josh
|
||||||
item.gun_autoshotgun.name=Auto-Flinte
|
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.folly_sm.name=Silver Bullet
|
||||||
item.ammo_secret.g12_equestrian.name=12 Gauge Railway Spike Shot
|
item.ammo_secret.g12_equestrian.name=12 Gauge Railway Spike Shot
|
||||||
item.ammo_secret.m44_equestrian.name=.44 Magnum Head-Exploder
|
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.name=.75 Bolt
|
||||||
item.ammo_standard.b75_exp.name=.75 Bolt (Explosive)
|
item.ammo_standard.b75_exp.name=.75 Bolt (Explosive)
|
||||||
item.ammo_standard.b75_inc.name=.75 Bolt (Incendiary)
|
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.grenade_zomg.name=Negative Energy Pair Annihilation Grenade
|
||||||
item.glyphid_gland.name= Gland
|
item.glyphid_gland.name= Gland
|
||||||
item.glyphid_gland_empty.name= Glyphid's Fluid Gland
|
item.glyphid_gland_empty.name= Glyphid's Fluid Gland
|
||||||
|
item.gun_aberrator.name=Aberrator
|
||||||
item.gun_am180.name=Silenced Submachine Gun
|
item.gun_am180.name=Silenced Submachine Gun
|
||||||
item.gun_ar15.name=Josh
|
item.gun_ar15.name=Josh
|
||||||
item.gun_autoshotgun.name=Auto Shotgun
|
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_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=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_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_bang=! ! !
|
||||||
potion.hbm_death=Astolfization
|
potion.hbm_death=Astolfization
|
||||||
|
|||||||
@ -1397,9 +1397,9 @@ hbmfluid.oil_ds=脱硫原油
|
|||||||
hbmfluid.oxygen=液氧
|
hbmfluid.oxygen=液氧
|
||||||
hbmfluid.oxyhydrogen=氢氧混合气
|
hbmfluid.oxyhydrogen=氢氧混合气
|
||||||
hbmfluid.pain=Pn(III) 钽铁溶液
|
hbmfluid.pain=Pn(III) 钽铁溶液
|
||||||
hbmfluid.perfluoromethyl=三氟碘甲烷
|
hbmfluid.perfluoromethyl=四氟甲烷
|
||||||
hbmfluid.perfluoromethyl_cold=冷三氟碘甲烷
|
hbmfluid.perfluoromethyl_cold=冷四氟甲烷
|
||||||
hbmfluid.perfluoromethyl_hot=热三氟碘甲烷
|
hbmfluid.perfluoromethyl_hot=热四氟甲烷
|
||||||
hbmfluid.peroxide=过氧化氢
|
hbmfluid.peroxide=过氧化氢
|
||||||
hbmfluid.petroil=汽油
|
hbmfluid.petroil=汽油
|
||||||
hbmfluid.petroil_leaded=含铅石油
|
hbmfluid.petroil_leaded=含铅石油
|
||||||
@ -6155,3 +6155,32 @@ desc.gui.upgrade.effectiveness=*§a效率§r:堆叠至3级
|
|||||||
desc.gui.upgrade.overdrive=*§7超速§r:堆叠至3级
|
desc.gui.upgrade.overdrive=*§7超速§r:堆叠至3级
|
||||||
desc.gui.upgrade.power=*§1节能§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.greaseGun": {"category": "player", "sounds": ["weapon/fire/greaseGun"]},
|
||||||
"weapon.fire.uzi": {"category": "player", "sounds": ["weapon/fire/uzi"]},
|
"weapon.fire.uzi": {"category": "player", "sounds": ["weapon/fire/uzi"]},
|
||||||
"weapon.fire.tesla": {"category": "player", "sounds": ["weapon/fire/tesla"]},
|
"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.boltClose": {"category": "player", "sounds": ["weapon/reload/boltClose"]},
|
||||||
"weapon.reload.boltOpen": {"category": "player", "sounds": ["weapon/reload/boltOpen"]},
|
"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