[1.7.10] Клиент, сервер и головная боль

svk

1,185
3
Мне подсказали, что на сервере это не будет работать, и вообще я не понимаю что означает if(!world.isRemote) и if(world.isRemote). Я думал что это обновление от сервера и клиента, но говорят что нет.
И что такое @SideOnly(Side.CLIENT). Если вызвать это от сервера, выполнит весь метод на клиенте или как? Если нет, зачем тогда вообще такая штуковина?
И ещё - реализовал скорострельность, но она не такая гладкая, рывками иногда, я так и не понял, из-за лагов это или нет : )
Код:
   package com.svk.industrialGuns.guns;

import java.util.List;
import java.util.Random;

import org.lwjgl.input.Mouse;

import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.entity.projectile.EntityLargeFireball;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.nbt.NBTTagCompound;

import com.svk.industrialGuns.entity.EntityBullet;

public class Firearm extends Item
{
    public double scatter = 0;
    private float bulletSpeed = 0;
    private int bulletDemage = 0;
    private int angels = 0;
    String name = null;
    private boolean fire = false;
    private int rate = 0;
    
    public Firearm(double scatter, String name, int bulletDemage, float bulletSpeed, int angels, int rate) 
    {
        super();
        this.scatter = scatter;
        this.name = name;
        this.bulletSpeed = bulletSpeed;
        this.bulletDemage = bulletDemage;
        this.angels = angels;
        this.rate = 20/rate;
    }
    
    @SideOnly(Side.CLIENT)
    public void registerIcons(IIconRegister ir) 
    {
       super.itemIcon = ir.registerIcon("industrialGuns:" + name);
    }
    
    public void onUpdate(ItemStack item, World world, Entity player, int par4, boolean par5) 
    {
        if(!world.isRemote)
        {
            fire = Mouse.isButtonDown(0);
        }
        
        if(item.getTagCompound() == null)
        {   
            item.stackTagCompound = new NBTTagCompound();
        }
        
        if(((EntityPlayer)player).inventory.getCurrentItem() == item)
        {
            item.getTagCompound().setBoolean("Fire", fire);
        }
        else
        {
            item.getTagCompound().setBoolean("Fire", false);
        }
        
        if(item.getTagCompound().getInteger("ReloadFire") != 0)
        {
            item.getTagCompound().setInteger("ReloadFire", item.getTagCompound().getInteger("ReloadFire") - 1);
        }
        
        if(item.getTagCompound().getBoolean("Fire"))
        {
            if(item.getTagCompound().getInteger("ReloadFire") == 0)
            {
                Vec3 movingobjectposition = player.getLookVec();
                EntityBullet entity = new EntityBullet(world, (EntityLivingBase) player, 1.0D, 1.0D, 1.0D);
                entity.isInRangeToRenderDist(10.0D);
                entity.setPosition(entity.posX + movingobjectposition.xCoord * 1.0D, entity.posY+1 + movingobjectposition.yCoord * 1.0D, entity.posZ + movingobjectposition.zCoord * 1.0D);
                entity.accelerationX = movingobjectposition.xCoord + scatterXZ() / scatter;
                entity.accelerationY = movingobjectposition.yCoord + scatterY() / scatter;
                entity.accelerationZ = movingobjectposition.zCoord + scatterXZ() / scatter;
                entity.BulletDamage = bulletDemage;
                entity.BulletSpeed = bulletSpeed;
                     
                world.spawnEntityInWorld(entity);
                 item.getTagCompound().setInteger("ReloadFire", rate);
                Client(world, player);
             } 
        }
    }

    @SideOnly(Side.CLIENT)
    private void Client(World world, Entity player)
    {
        Minecraft.getMinecraft().thePlayer.setAngles(0, angels);
         world.playSound(player.posX, player.posY, player.posZ, "random.bow", 10, 5, true);
    }
    
    public final void saveNBTData(NBTTagCompound compound) 
    {
    }
    
    public final void loadNBTData(NBTTagCompound compound) 
    {
    }
    
    @Override
    public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
    {
        par3List.add("Bullet speed: " + bulletSpeed);
        par3List.add("Bullet damage: " + bulletDemage);
        par3List.add("Scatter: " + scatter);
        par3List.add("Angels: " + angels);
    }

    private double scatterXZ()
    {
        double returnD = 0;
        Random r = new Random();    
        int i = r.nextInt(100);
        int i2 = r.nextInt(10);
        
        if (i < 30) {returnD = 0.1;}
        else if (i >= 30 && i < 90) {returnD = 0.07;} 
        else if (i >= 90) {returnD = 0.05;} 
        else {returnD = 0;}
        
        if (i2 < 5){returnD *= -1;}
        
        return returnD;
    }
    
    private double scatterY()
    {
        double returnD = 0;
        Random r = new Random();    
        int i = r.nextInt(100);
        int i2 = r.nextInt(10);
        
        if (i < 30) {returnD = 0.1;}
        else if (i >= 30 && i < 90) {returnD = 0.07;} 
        else if (i >= 90) {returnD = 0.05;} 
        else {returnD = 0;}
        
        if (i2 < 5){returnD *= -1;}
        
        return returnD;
    }
}
 
Узнал про какой-то Side side = FMLCommonHandler.instance().getEffectiveSide();
Хотелось-бы узнать альтернативу на 1.7.10.
 
Нет, реально не гладкая скорострельность :(HELP!
[merge_posts_bbcode]Добавлено: 18.02.2015 23:03:32[/merge_posts_bbcode]

Суть вот в чём: Обнаружение стрельбы идёт от клиента. Надо сделать так, что-бы сервер знал идёт-ли сейчас огонь. И сервер спавнит ентити, играет звук (Вроде как и на клиенте и на сервере должно быть), потом, опять передаёт клиенту, что он должен сделать отдачу.
 
boolean
[merge_posts_bbcode]Добавлено: 19.02.2015 01:26:33[/merge_posts_bbcode]

И onUpdate.Там обновляй клиент,сервер
 
Dovakin написал(а):
boolean
[merge_posts_bbcode]Добавлено: 19.02.2015 01:26:33[/merge_posts_bbcode]

И onUpdate.Там обновляй клиент,сервер
Я же говорю, если world.isRemote проверять Mouse.isButtonDown(0) то весь цикл будет клиентским.
Даже если записывать это в НБТ, записывается только в клиентский предмет, на сервере же лажа...
[merge_posts_bbcode]Добавлено: 18.02.2015 23:35:57[/merge_posts_bbcode]

Пытался даже разделить 2 метода - клиентский и серверный, всеравно лажа...

[merge_posts_bbcode]Добавлено: 18.02.2015 23:37:16[/merge_posts_bbcode]

Пойду разберу flan`s mod...
 
ВОзьми во фланс моде апи и создай свой мод на основе его.Паки пилить будет легче
 
Нет я сам буду ^_^
Завтра начну разбирать flan`s mod и прочту несколько статей про пакеты, может, даже, гайд сделаю :)
 
Создай пакеты на события нажатия и отпускания кнопки.
А вообще за тебя всё сделано - onStarted/StoppingUsingItem. Через них меняй состояние стрельбы, и все будет хорошо. На клиенте можешь интерполяцию использовать.
 
Oldestkon написал(а):
Создай пакеты на события нажатия и отпускания кнопки.
А вообще за тебя всё сделано - onStarted/StoppingUsingItem. Через них меняй состояние стрельбы, и все будет хорошо. На клиенте можешь интерполяцию использовать.
Я на левую хотел, как в контре ^_^
 
Назад
Сверху