- 442
- 42
- 113
Код рендера:
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import plus.camera.Camera;
import plus.player.PlayerSpship;
import plus.utls.MathUtls;
import plus.utls.Vec3d;
@Mixin(RenderPlayer.class)
public abstract class MixinRenderPlayer{
private static final float scale = 1.85f;
private float prevXZrot = 0;
private float prevYrot = 0f;
private boolean isActive = false;
private int freezeTimes;
@Inject(method = "doRender*", at = @At("HEAD"), cancellable = true)
public void doRender(AbstractClientPlayer player, double x, double y,
double z, float entityYaw, float partialTicks, CallbackInfo ci) {
//тут либо EntityOtherPlayerMP (другие игроки), либо EntityPlayerSP (контролируемый игрок)
//то что тут бывают и те и другие - мне сказал отладчик
boolean isSelfModel = player instanceof EntityPlayerSP;
boolean isSpshipMode;
if(isSelfModel){
isSpshipMode = ((PlayerSpship)player).isSpshipMode();
} else {
isSpshipMode = ((PlayerSpship)player).getSpModelId()!=-1;
}
//переключает стандартный рендер, если выполнилось условие
if(isSpshipMode) {
//отключаю стандартный рендер, теперь модель игрока не отрисовывается
ci.cancel();
if(!isActive){
isActive = true;
freezeTimes = 0;
prevXZrot = 180-player.rotationYaw;
}
//новая функция рендера
renderSpship(player, partialTicks, isSelfModel);
} else {
if(isActive) {
isActive = false;
}
}
}
private void renderSpship(AbstractClientPlayer player, float partialTicks, boolean isSelfModel){
float rotXZ = calcXZrot(player, partialTicks);
float rotY = calcYRot(player, partialTicks);
if(isSelfModel){
Camera.spshipRotY = rotY;
Camera.spshipRotXZ = rotXZ;
}
GlStateManager.pushMatrix();
GlStateManager.scale(scale, scale, scale);
GlStateManager.translate(0, 0.5, 0);
GlStateManager.rotate(rotXZ, 0, 1, 0);
GlStateManager.rotate(rotY, 1, 0, 0);
RenderItem renderer = Minecraft.getMinecraft().getRenderItem();
//а вот эта хрень рендерится для всех, однако не в точке сущности
//а в точке собственного игрока
//и в итоге получается так, что когда 2 игрока рядом, то
//собственный игрок рендерится с 2-мя моделями (блоками стекла),
//повернутыми под разными углами, а другие игроки - вообще не рисуются
//и так для каждого клиента
renderer.renderItem(
new ItemStack(Blocks.GLASS),
player, ItemCameraTransforms.TransformType.FIXED, false
);
GlStateManager.popMatrix();
}
private float calcXZrot(AbstractClientPlayer player, float partialTicks){
float result = .. //сложная алгебра расчета угла поворота
prevXZrot = result;
return result;
}
private float calcYRot(AbstractClientPlayer player, float partialTicks){
float result = .. //другая сложная алгебра расчета угла
prevYrot = result;
return result;
}
}
Последнее редактирование: