[Решено] Энтити

Статус
В этой теме нельзя размещать новые ответы.
1,976
68
220
Да он просто висит на месте, даже если насильно задать ему движение! Что за чёрт?!
Кхм... Извините, вырвалось :D
Сперва, здравствуйте =)
Как понятно из текста выше, мой энтити (extends Entity) вообще не хочет двигаться - this.motionY -= 0.5D; в онапдейте просто игнорирует. Я видел, что в энтитях есть датавотчер, но я вообще не представляю, как с ним работать. Проблема в его отсутствии или..?
Код:
package alexsocol.osm.entity;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;

// Да-да-да, это "очередной" танк, но не простой, а стреляющий ионизированной плазмой (ну как в UT2004 :D)
public class IonPlasmaTankEntity extends Entity {
    
    public EntityPlayer ridder;
    
    public IonPlasmaTankEntity(World world) {
        super(world);
        this.setSize(5.0F, 3.0F);
    }

    public IonPlasmaTankEntity(World world, double X, double Y, double Z) {
        super(world);
        this.setSize(5.0F, 3.0F);
        this.setLocationAndAngles(X, Y, Z, 0.0F, 0.0F);
    }
    
    @Override
    public boolean interactFirst(EntityPlayer player) {
        if (!this.worldObj.isRemote) {
            if (this.riddenByEntity == null) {
                player.mountEntity(this);
                this.riddenByEntity = this.ridder = player;
            }
        }
        return true;
    }
    
    @Override
    public AxisAlignedBB getBoundingBox() {
        return this.boundingBox;
    }

    @Override
    public boolean canBeCollidedWith() {
        return true;
    }

    @Override
    public boolean canBePushed() {
        return false;
    }

    @Override
    public void updateRiderPosition() {
        if (this.riddenByEntity != null) {
            this.riddenByEntity.setPosition(this.posX, this.posY + this.getMountedYOffset() + this.riddenByEntity.getYOffset(), this.posZ);
        }
    }
    
    @Override
    public void onUpdate() {
        if (this.posY <= -64.0D) {
            this.kill();
        }

        this.motionY -= 0.5D;
        
        if (this.riddenByEntity != null && ridder != null) {
            this.setRotation(ridder.cameraYaw, 0.0F);
            
/** Ridder Invulnerability */
            if (!ridder.capabilities.isCreativeMode) {
                if (this.riddenByEntity == ridder) {
                    ridder.capabilities.disableDamage = true;
                } else {
                    ridder.capabilities.disableDamage = false;
                }
            }
            
        } else if (ridder != null && !ridder.capabilities.isCreativeMode) {
            ridder.capabilities.disableDamage = false;
            ridder = null;
        }
        
        this.motionY -= 0.5D;
    }
    
    @Override
    public void entityInit() { }

    @Override
    public void readEntityFromNBT(NBTTagCompound nbt) { }

    @Override
    public void writeEntityToNBT(NBTTagCompound nbt) { }

    @Override
    public double getMountedYOffset() {
        return (double)this.height * 0.0D + 2.5D;
    }

    @SideOnly(Side.CLIENT)
    public float getShadowSize() {
        return 5.0F;
    }
}
 
1,990
18
105
А куда он должен двигаться по-твоему? В землю? Так его вытолкнет и небось сбросит motionY.
 
1,976
68
220
Он даже в воздухе не двигается ._.
[merge_posts_bbcode]Добавлено: 01.07.2016 15:02:12[/merge_posts_bbcode]

Какая вообще разница куда? Вопрос почему не работает.
 
1,990
18
105
Так ты же вообще базовую сущность наследуешь. А там moveEntity вроде и не вызывается, так что ты там напроблемонаследовал)0

Хоть бы майнокод читали, перед тем как бежать на форум с очередным офигенным вопросом.
Дебаггером пользоваться не учили? Вставляешь брейкпоинт на любую строку в методе, где идет логика обновления позиции сущности, а потом уже удивляешься, почему он не вызывается и потихоньку смотришь всю иерархию вызовов, откуда этот метод может быть запущен.

Либо проблемы от перезаписанного getBoundingBox.
У меня ноль желания запускать даже проект с майном, чтобы тебе что-то детальнее сказать.
 
1,976
68
220
Ну блин, я что, с Entity хоть раз работал? Только мобов делал, а они сами как-то справляются. Тут же с нуля приспичило (просто extends Entity) и я не знаю, с какой стороны за это браться :ermm:
[merge_posts_bbcode]Добавлено: 01.07.2016 15:56:00[/merge_posts_bbcode]

Да, добавил мувэнтити, и он начал двигаться :D
 
1,976
68
220
А подскажите, пожалуйста, как ему движение задавать? Вот сидит игрок на энтити, нажимает кнопку "вперёд" (какая там в настройках задана) и увеличивает скорость (ну то есть чтобы нажал и отпустил, а энтити всё равно двигается) - просто добавлять +1 к параметру скорости, её саму я уже как-нибудь высчитаю. Как-то у меня даже идей нет, в какой метод энтити (и энтити ли вообще) это записывать...

Разве что в каком-то онапдейт эвенте, проверяя, на энтити-ли игрок и посылая, о ужас, пакет, в которых я вообще не разбираюсь, который и будет менять параметр скорости в энтити..?
[merge_posts_bbcode]Добавлено: 01.07.2016 17:37:07[/merge_posts_bbcode]

В лодке нашёл это:
Код:
if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) {
        EntityLivingBase entitylivingbase = (EntityLivingBase)this.riddenByEntity;
        float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F;
        this.motionX += -Math.sin((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D;
        this.motionZ += Math.cos((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D;
}

[merge_posts_bbcode]Добавлено: 01.07.2016 17:42:51[/merge_posts_bbcode]

Оно, вроде бы, работает, энтити двигается, но постоянно происходят "откаты", как будто сервер лагает и энтити возвращается на свою точку. Я опять что-то не дописал?
 

Icosider

Kotliner
Администратор
3,600
99
663
AlexSocol написал(а):
А подскажите, пожалуйста, как ему движение задавать? Вот сидит игрок на энтити, нажимает кнопку "вперёд" (какая там в настройках задана) и увеличивает скорость (ну то есть чтобы нажал и отпустил, а энтити всё равно двигается) - просто добавлять +1 к параметру скорости, её саму я уже как-нибудь высчитаю. Как-то у меня даже идей нет, в какой метод энтити (и энтити ли вообще) это записывать...

Разве что в каком-то онапдейт эвенте, проверяя, на энтити-ли игрок и посылая, о ужас, пакет, в которых я вообще не разбираюсь, который и будет менять параметр скорости в энтити..?
[merge_posts_bbcode]Добавлено: 01.07.2016 17:37:07[/merge_posts_bbcode]

В лодке нашёл это:
Код:
if (this.riddenByEntity != null && this.riddenByEntity instanceof EntityLivingBase) {
        EntityLivingBase entitylivingbase = (EntityLivingBase)this.riddenByEntity;
        float f = this.riddenByEntity.rotationYaw + -entitylivingbase.moveStrafing * 90.0F;
        this.motionX += -Math.sin((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D;
        this.motionZ += Math.cos((double)(f * (float)Math.PI / 180.0F)) * this.speedMultiplier * (double)entitylivingbase.moveForward * 0.05000000074505806D;
}

[merge_posts_bbcode]Добавлено: 01.07.2016 17:42:51[/merge_posts_bbcode]

Оно, вроде бы, работает, энтити двигается, но постоянно происходят "откаты", как будто сервер лагает и энтити возвращается на свою точку. Я опять что-то не дописал?
Глянь как в лодке или на свинье. Возможно нужно проверять позицию энтити или игрока, а возможно и пакеты слать.
 
1,976
68
220
Всё фигня, никакие пакеты или эвенты не нужны, сделал модификатор скорости, который меняю обычной проверкой нажатых кнопок в (!) onUpdate. Логично же! И, главное, работает. 
А направление ещё проще - вспомнив школьный курс математики, в голову придёт такая замечательная вещь, как тригонометрия (а если не придёт - есть сурсы лодки выше ;D). Просто получать координаты точки через -sin и cos от горизонтального угла поворота танка (а его уже можно менять, например, кнопками лево/право). Она всегда лежит на окружности с радиусом 1 (нормализованный вектор же), так что и скорость всегда будет равна единице (максимальная), а изменять её тем самым модификатором в нужных пределах.
Изи же. А я заладил "покеты, ко-ко-ко, ивенты"... Как говорят, всё гениальное - просто.
Теперь осталось добавить выстрелы и танк, можно сказать, готов :D
Ну а тему можно закрывать, спасибо за помощь =)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху