- 65
- 6
У меня есть механизм, у которого есть три режима и в зависимости от выбранного режима должен выполняться свой рецепт(Чем-то похоже на Metal Former из IC2).
Всё хорошо, но режимы изменяются только на стороне клиента, на сервер изменения не идут.Отрисовка GUI идёт нормально.
В класс где проверяю возможность крафта режим подаётся из TileEntity.
Я предполагаю, что это можно решить только пакетами, если да - то что мне примерно надо сделать в коде пакета для отправки на сервер.Пример пакетов брал от сюда:
[1.7-1.13.2] Пакетная система.Даже не знаю, надо ли исходники прикреплять...
P.S. Часть кода была убрана, чтобы было меньше кода.
Заранее спасибо!
Всё хорошо, но режимы изменяются только на стороне клиента, на сервер изменения не идут.Отрисовка GUI идёт нормально.
В класс где проверяю возможность крафта режим подаётся из TileEntity.
Я предполагаю, что это можно решить только пакетами, если да - то что мне примерно надо сделать в коде пакета для отправки на сервер.Пример пакетов брал от сюда:
[1.7-1.13.2] Пакетная система.
Java:
package ru.mrtenfan.metalfevermachinery.tileentity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import ru.mrtenfan.metalfevermachinery.ConfigFile;
import ru.mrtenfan.metalfevermachinery.blocks.MetalProcessor;
import ru.mrtenfan.metalfevermachinery.crafting.MetalProcessorRecipe;
import ru.mrtenfan.metalfevermachinery.crafting.MetalProcessorRecipe.MetalProcessing;
public class TileEntityMetalProcessor extends TileEntityBasicMachine implements ISidedInventory {
private String localyzedName;
private ItemStack[] slots;
public static int rollingSpeed = ConfigFile.rollingSpeed;
public int cookTime;
private int mode;
private static final int[] slots_in = new int[] {0};
private static final int[] slots_out = new int[] {2};
public TileEntityMetalProcessor() {
slots = new ItemStack[3];
mode = 0;
}
public void updateEntity() {
boolean flag = this.cookTime > 0;
boolean flag1 = false;
MetalProcessing recipe = MetalProcessorRecipe.getRecipe(slots[0], getMode());
int RFPerTick = 0;
if(recipe != null)
RFPerTick = (int)(recipe.getRFPerTick());
if(this.hasEnergy() && this.canRoll(recipe)) {
this.cookTime++;
energyStorage.modifyEnergyStored(-RFPerTick);
if(cookTime == rollingSpeed) {
cookTime = 0;
this.rollItem(recipe);
flag1 = true;
}
}else {
cookTime = 0;
}
if (flag != this.hasEnergy()) {
flag1 = true;
MetalProcessor.updateBlockState(this.cookTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
}
if (flag1) {
this.markDirty();
}
}
public void setMode(int i) {
if(i > 0 && i != mode)
this.mode = i;
if(this.mode > 2)
this.mode = 0;
}
public int getMode() {
return mode;
}
public String getModeName() {
String name = null;
switch(mode) {
case 0:
name = "Rolling";
break;
case 1:
name = "Cutting";
break;
case 2:
name = "Shaping";
break;
}
return name;
}
}
Java:
package ru.mrtenfan.metalfevermachinery.crafting;
import java.util.ArrayList;
import net.minecraft.item.ItemStack;
import ru.mrtenfan.MTFCore.utils.ItemUtils;
import ru.mrtenfan.MTFCore.utils.OreDictUtils;
import ru.mrtenfan.metalfeverbasis.ConfigFile;
import ru.mrtenfan.metalfeverbasis.init.MFItems;
import ru.mrtenfan.metalfevermachinery.init.MFMItems;
import ru.mrtenfan.metalfevermachinery.tileentity.TileEntityMetalProcessor;
public class MetalProcessorRecipe {
private static final int standartRFPerTick = 12000;
public static ArrayList<MetalProcessing> recipes = new ArrayList<MetalProcessing>();
public static void addRollingRecipe(ItemStack input, boolean isod, ItemStack output, int RFForRecipe) {
addMetalProcessing(0, input, isod, output, RFForRecipe);
}
public static void addCuttingRecipe(ItemStack input, boolean isod, ItemStack output, int RFForRecipe) {
addMetalProcessing(1, input, isod, output, RFForRecipe);
}
public static void addShapingRecipe(ItemStack input, boolean isod, ItemStack output, int RFForRecipe) {
addMetalProcessing(2, input, isod, output, RFForRecipe);
}
public static void addMetalProcessing(int mode, ItemStack input, boolean isod, ItemStack output, int RFForRecipe) {
recipes.add(new MetalProcessing(mode, input, isod, output, RFForRecipe));
}
public static void addRecipe(MetalProcessing recipe) {
recipes.add(recipe);
}
public static MetalProcessing getRecipe(ItemStack input, int i) {
if(i < 0 && i > 2) return null;
for(MetalProcessing r : recipes) {
if(r.equals(input, i))
return r;
}
return null;
}
public static class MetalProcessing {
private final int mode;
private final ItemStack input;
private final ItemStack result;
private final int RFPerTick;
private final int RFUsed;
private final boolean isoredict;
public MetalProcessing(int mode, ItemStack input, boolean isod, ItemStack output, int RFForRecipe) {
this.mode = mode;
this.input = input;
this.result = output;
this.RFPerTick = (int) RFForRecipe / TileEntityMetalProcessor.rollingSpeed;
this.RFUsed = RFForRecipe;
this.isoredict = isod;
}
@Override
public boolean equals(Object o) {
if(!(o instanceof MetalProcessing)) return false;
MetalProcessing r = (MetalProcessing)o;
return r.mode == this.mode ? (ItemUtils.isItemEqual(r.input, this.input, r.isoredict && this.isoredict) ? (ItemUtils.isItemEqual(r.result, this.result, false) ? (r.RFPerTick == this.RFPerTick) : false) : false) : false;
}
public boolean equals(ItemStack is, int i) {
return this.mode == i && ItemUtils.isItemEqual(this.input, is, this.isoredict);
}
public int getMode() {
return mode;
}
public ItemStack getInput() {
return input;
}
public ItemStack getResult() {
return result;
}
public int getRFPerTick() {
return RFPerTick;
}
public int getRFUsed() {
return RFUsed;
}
public boolean isOreDict() {
return isoredict;
}
}
}
Java:
public static boolean isItemEqual(Object item1, Object item2, boolean isOreDict) {
if(item1 == null || item2 == null) return false;
ItemStack item1is = null, item2is = null;
if(item1 instanceof Item)
item1is = new ItemStack((Item)item1);
else if(item1 instanceof Block)
item1is = new ItemStack((Block)item1);
else if(item1 instanceof ItemStack)
item1is = (ItemStack)item1;
else
Debuging.warnOutput("obj is not an Item, Block or ItemStack.This is an error, please let the author know.");
if(item2 instanceof Item)
item2is = new ItemStack((Item)item2);
else if(item2 instanceof Block)
item2is = new ItemStack((Block)item2);
else if(item2 instanceof ItemStack)
item2is = (ItemStack)item2;
else
Debuging.warnOutput("obj is not an Item, Block or ItemStack.This is an error, please let the author know.");
if(item1is.getItem() == item2is.getItem() && item1is.getItemDamage() == item2is.getItemDamage())
return true;
if(isOreDict)
for(int intItem1 : OreDictionary.getOreIDs(item1is))
for(int intItem2 : OreDictionary.getOreIDs(item2is))
if(intItem1 == intItem2)
return true;
return false;
}
Заранее спасибо!