Diskuze: Minecraft modding
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Luboš Běhounek Satik:5.8.2016 13:56
se koukni do obsluhy toho kliknutí pravým tlačítkem, co se tam děje
pocitac770:5.8.2016 16:59
Trošku jsem hrabal v těch knihovnách Forge, zkus toto:
tvujObjektEntityTameable.getAISit().startExecuting();
//tohle tam píšu jenom kvůli jistotě, aby to AI fungovalo správně
tvujObjektEntityTameable.getAISit().setSitting(true);
A při zrušení sezení
tvujObjektEntityTameable.getAISit().resetTask();
tvujObjektEntityTameable.getAISit().setSitting(false);
Maty Klug, pročby ne? Zkus se normálně podívat na toto: http://www.itnetwork.cz/…raft-modding s tím, že při instalacích nástrojů zvolíš varianty pro Mac
Dr.umělec:7.8.2016 9:52
Ahoj,nwm bud jsem asi blbej já a nebo eclipse,protože mi tu tvojí syntaxi nechce uznat
pocitac770:9.8.2016 0:00
Jakou máš verzi Forge? (jde z toho i vyčíst verzi MC, ale jsem línej, tak mi prosím řekni i tu ). Je možné, že používáme každej jinou knihovnu...
Případně se podívej, jestli u metod, kde ti to nebere, ti našeptávač neradí metody typu func18392(), to by jsi pak musel dohledat konkrétní metodu podle návratového typu (např. getAISit() logicky vrací AISit).
pocitac770:10.8.2016 15:58
Mohl sis to urychlit, kdyby ses podíval sám, každopádně by mělo jít o metodu func_70907_r()
Dr.umělec:10.8.2016 17:20
jj,toto metodu jsem taky našel jsem koukal ,že to volá samo i startExecuting().Ještě něco skusím a pak napíšu.
Dr.umělec:11.8.2016 18:01
Ahoj,promin ,že tě takto obtěžuju,ale když vytvořim konstruktor třídy toho moba v jiné třídě ,tak se mi to Tameable červeně podtrhne ,a když klidnu na tu žárovičku ,tak mi to nabízí at udělám nějaky objekt třídy tameable v třídě toho moba
pocitac770:11.8.2016 20:37
Vytvořil sis vlastní třídu vlastního moba, která z třídy EntityTameable dědí?
pocitac770:11.8.2016 22:15
Vyscreenuj to, co ti to píše (v té žárovičce), aby byl zároveň vidět tvůj kus kódu + sem pošli zdroják tý třídy moba
Dr.umělec:12.8.2016 11:19
package net.uq.mod.entity;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockColored;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityAgeable;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.EntityAIAttackOnCollide;
import net.minecraft.entity.ai.EntityAIFollowOwner;
import net.minecraft.entity.ai.EntityAILeapAtTarget;
import net.minecraft.entity.ai.EntityAILookIdle;
import net.minecraft.entity.ai.EntityAIMate;
import net.minecraft.entity.ai.EntityAISwimming;
import net.minecraft.entity.ai.EntityAIWander;
import net.minecraft.entity.ai.EntityAIWatchClosest;
import net.minecraft.entity.monster.EntityCreeper;
import net.minecraft.entity.monster.EntityGhast;
import net.minecraft.entity.passive.EntityAnimal;
import net.minecraft.entity.passive.EntityHorse;
import net.minecraft.entity.passive.EntityTameable;
import net.minecraft.entity.passive.EntityWolf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.pathfinding.PathEntity;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.uq.mod.Uq;
public class Entity_Werca extends EntityTameable
{
private float field_70926_e;
private float field_70924_f;
/** true is the wolf is wet else false */
private boolean isShaking;
private boolean field_70928_h;
/** This time increases while wolf is shaking and emitting water particles. */
private float timeWolfIsShaking;
private float prevTimeWolfIsShaking;
private static final String __OBFID = "CL_00001654";
//vajicko
public int timeUntilNextEgg;
private boolean field_152118_bv;
public Object EntityTameable;
public Entity_Werca(World p_i1696_1_)
{
super(p_i1696_1_);
this.setSize(0.6F, 1.8F);
this.timeUntilNextEgg = this.rand.nextInt(12000) + 12000;
this.tasks.addTask(1, new EntityAISwimming(this));
this.tasks.addTask(2, this.aiSit);
this.tasks.addTask(3, new EntityAILeapAtTarget(this, 0.4F));
this.tasks.addTask(4, new EntityAIAttackOnCollide(this, 1.0D, true));
this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 2.0F));
this.tasks.addTask(6, new EntityAIMate(this, 1.0D));
this.tasks.addTask(7, new EntityAIWander(this, 1.0D));
this.tasks.addTask(9, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
this.tasks.addTask(9, new EntityAILookIdle(this));
this.setTamed(false);
}
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D);
if (this.isTamed())
{
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D);
}
else
{
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D);
}
}
public boolean isAIEnabled()
{
return true ;
}
/**
* Sets the active target the Task system uses for tracking
*/
public void setAttackTarget(EntityLivingBase p_70624_1_)
{
super.setAttackTarget(p_70624_1_);
if (p_70624_1_ == null)
{
this.setAngry(false);
}
else if (!this.isTamed())
{
this.setAngry(true);
}
}
/**
* main AI tick function, replaces updateEntityActionState
*/
protected void updateAITick()
{
this.dataWatcher.updateObject(18, Float.valueOf(this.getHealth()));
}
protected void entityInit()
{
super.entityInit();
this.dataWatcher.addObject(18, new Float(this.getHealth()));
this.dataWatcher.addObject(19, new Byte((byte)0));
this.dataWatcher.addObject(20, new Byte((byte)BlockColored.func_150032_b(1)));
}
protected void func_145780_a(int p_145780_1_, int p_145780_2_, int p_145780_3_, Block p_145780_4_)
{
this.playSound("mob.wolf.step", 0.15F, 1.0F);
}
/**
* (abstract) Protected helper method to write subclass entity data to NBT.
*/
public void writeEntityToNBT(NBTTagCompound p_70014_1_)
{
super.writeEntityToNBT(p_70014_1_);
p_70014_1_.setBoolean("Angry", this.isAngry());
}
/**
* (abstract) Protected helper method to read subclass entity data from NBT.
*/
public void readEntityFromNBT(NBTTagCompound p_70037_1_)
{
super.readEntityFromNBT(p_70037_1_);
this.setAngry(p_70037_1_.getBoolean("Angry"));
}
/**
* Returns the sound this mob makes while it's alive.
*/
protected String getLivingSound()
{
return this.isAngry() ? "mob.wolf.growl" : (this.rand.nextInt(3) == 0 ? (this.isTamed() && this.dataWatcher.getWatchableObjectFloat(18) < 10.0F ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark");
}
/**
* Returns the sound this mob makes when it is hurt.
*/
protected String getHurtSound()
{
return "mob.wolf.hurt";
}
/**
* Returns the sound this mob makes on death.
*/
protected String getDeathSound()
{
return "mob.wolf.death";
}
/**
* Returns the volume for the sounds this mob makes.
*/
protected float getSoundVolume()
{
return 0.4F;
}
protected Item getDropItem()
{
return Item.getItemById(-1);
}
/**
* Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
* use this to react to sunlight and start to burn.
*/
public void onLivingUpdate()
{
//prdeni
super.onLivingUpdate();
if (!this.worldObj.isRemote && !this.isChild() && !this.func_152116_bZ() && --this.timeUntilNextEgg <= 0)
{
this.playSound("mob.chicken.plop", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
this.dropItem(Uq.itemBobek, 1);
this.timeUntilNextEgg = this.rand.nextInt(12000) + 12000;
}
if (!this.worldObj.isRemote && this.isShaking && !this.field_70928_h && !this.hasPath() && this.onGround)
{
this.field_70928_h = true;
this.timeWolfIsShaking = 0.0F;
this.prevTimeWolfIsShaking = 0.0F;
this.worldObj.setEntityState(this, (byte)8);
}
}
public boolean func_152116_bZ()
{
return this.field_152118_bv;
}
/**
* Called to update the entity's position/logic.
*/
public void onUpdate()
{
super.onUpdate();
this.field_70924_f = this.field_70926_e;
if (this.func_70922_bv())
{
this.field_70926_e += (1.0F - this.field_70926_e) * 0.4F;
}
else
{
this.field_70926_e += (0.0F - this.field_70926_e) * 0.4F;
}
if (this.func_70922_bv())
{
this.numTicksToChaseTarget = 10;
}
if (this.isWet())
{
this.isShaking = true;
this.field_70928_h = false;
this.timeWolfIsShaking = 0.0F;
this.prevTimeWolfIsShaking = 0.0F;
}
else if ((this.isShaking || this.field_70928_h) && this.field_70928_h)
{
if (this.timeWolfIsShaking == 0.0F)
{
this.playSound("mob.wolf.shake", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
}
this.prevTimeWolfIsShaking = this.timeWolfIsShaking;
this.timeWolfIsShaking += 0.05F;
if (this.prevTimeWolfIsShaking >= 2.0F)
{
this.isShaking = false;
this.field_70928_h = false;
this.prevTimeWolfIsShaking = 0.0F;
this.timeWolfIsShaking = 0.0F;
}
if (this.timeWolfIsShaking > 0.4F)
{
float f = (float)this.boundingBox.minY;
int i = (int)(MathHelper.sin((this.timeWolfIsShaking - 0.4F) * (float)Math.PI) * 7.0F);
for (int j = 0; j < i; ++j)
{
float f1 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
float f2 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F;
this.worldObj.spawnParticle("splash", this.posX + (double)f1, (double)(f + 0.8F), this.posZ + (double)f2, this.motionX, this.motionY, this.motionZ);
}
}
}
}
@SideOnly(Side.CLIENT)
public boolean getWolfShaking()
{
return this.isShaking;
}
/**
* Used when calculating the amount of shading to apply while the wolf is shaking.
*/
@SideOnly(Side.CLIENT)
public float getShadingWhileShaking(float p_70915_1_)
{
return 0.75F + (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70915_1_) / 2.0F * 0.25F;
}
@SideOnly(Side.CLIENT)
public float getShakeAngle(float p_70923_1_, float p_70923_2_)
{
float f2 = (this.prevTimeWolfIsShaking + (this.timeWolfIsShaking - this.prevTimeWolfIsShaking) * p_70923_1_ + p_70923_2_) / 1.8F;
if (f2 < 0.0F)
{
f2 = 0.0F;
}
else if (f2 > 1.0F)
{
f2 = 1.0F;
}
return MathHelper.sin(f2 * (float)Math.PI) * MathHelper.sin(f2 * (float)Math.PI * 11.0F) * 0.15F * (float)Math.PI;
}
public float getEyeHeight()
{
return this.height * 0.8F;
}
@SideOnly(Side.CLIENT)
public float getInterestedAngle(float p_70917_1_)
{
return (this.field_70924_f + (this.field_70926_e - this.field_70924_f) * p_70917_1_) * 0.15F * (float)Math.PI;
}
/**
* The speed it takes to move the entityliving's rotationPitch through the faceEntity method. This is only currently
* use in wolves.
*/
public int getVerticalFaceSpeed()
{
return this.isSitting() ? 20 : super.getVerticalFaceSpeed();
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_)
{
if (this.isEntityInvulnerable())
{
return false;
}
else
{
Entity entity = p_70097_1_.getEntity();
this.aiSit.setSitting(false);
if (entity != null && !(entity instanceof EntityPlayer) && !(entity instanceof EntityArrow))
{
p_70097_2_ = (p_70097_2_ + 1.0F) / 2.0F;
}
return super.attackEntityFrom(p_70097_1_, p_70097_2_);
}
}
public boolean attackEntityAsMob(Entity p_70652_1_)
{
int i = this.isTamed() ? 4 : 2;
return p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), (float)i);
}
public void setTamed(boolean p_70903_1_)
{
super.setTamed(p_70903_1_);
if (p_70903_1_)
{
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(20.0D);
}
else
{
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D);
}
}
/**
* Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
*/
public boolean interact(EntityPlayer p_70085_1_)
{
ItemStack itemstack = p_70085_1_.inventory.getCurrentItem();
if (this.isTamed())
{
if (itemstack != null)
{
if (itemstack.getItem() instanceof ItemFood)
{
ItemFood itemfood = (ItemFood)itemstack.getItem();
if (itemfood.isWolfsFavoriteMeat() && this.dataWatcher.getWatchableObjectFloat(18) < 20.0F)
{
if (!p_70085_1_.capabilities.isCreativeMode)
{
--itemstack.stackSize;
}
this.heal((float)itemfood.func_150905_g(itemstack));
if (itemstack.stackSize <= 0)
{
p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
}
return true;
}
}
else if (itemstack.getItem() == Items.dye)
{
int i = BlockColored.func_150032_b(itemstack.getItemDamage());
if (!p_70085_1_.capabilities.isCreativeMode && --itemstack.stackSize <= 0)
{
p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
}
return true;
}
}
}
if (this.func_152114_e(p_70085_1_) && !this.worldObj.isRemote && !this.isBreedingItem(itemstack))
{
this.aiSit.setSitting(!this.isSitting());
this.isJumping = false;
this.setPathToEntity((PathEntity)null);
this.setTarget((Entity)null);
this.setAttackTarget((EntityLivingBase)null);
}
else if (itemstack != null && itemstack.getItem() == Items.nether_star && !this.isAngry())
{
if (!p_70085_1_.capabilities.isCreativeMode)
{
--itemstack.stackSize;
}
if (itemstack.stackSize <= 0)
{
p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null);
}
if (!this.worldObj.isRemote)
{
if (this.rand.nextInt(3) == 0)
{
this.setTamed(true);
this.setPathToEntity((PathEntity)null);
this.setAttackTarget((EntityLivingBase)null);
this.aiSit.setSitting(true);
this.setHealth(20.0F);
this.func_152115_b(p_70085_1_.getUniqueID().toString());
this.playTameEffect(true);
this.worldObj.setEntityState(this, (byte)7);
}
else
{
this.playTameEffect(false);
this.worldObj.setEntityState(this, (byte)6);
}
}
return true;
}
return super.interact(p_70085_1_);
}
@SideOnly(Side.CLIENT)
public void handleHealthUpdate(byte p_70103_1_)
{
if (p_70103_1_ == 8)
{
this.field_70928_h = true;
this.timeWolfIsShaking = 0.0F;
this.prevTimeWolfIsShaking = 0.0F;
}
else
{
super.handleHealthUpdate(p_70103_1_);
}
}
@SideOnly(Side.CLIENT)
public float getTailRotation()
{
return this.isAngry() ? 1.5393804F : (this.isTamed() ? (0.55F - (20.0F - this.dataWatcher.getWatchableObjectFloat(18)) * 0.02F) * (float)Math.PI : ((float)Math.PI / 5F));
}
/**
* Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on
* the animal type)
*/
public boolean isBreedingItem(ItemStack p_70877_1_)
{
return p_70877_1_ == null ? false : (!(p_70877_1_.getItem() instanceof ItemFood) ? false : ((ItemFood)p_70877_1_.getItem()).isWolfsFavoriteMeat());
}
/**
* Will return how many at most can spawn in a chunk at once.
*/
public int getMaxSpawnedInChunk()
{
return 0;
}
/**
* Determines whether this wolf is angry or not.
*/
public boolean isAngry()
{
return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0;
}
/**
* Sets whether this wolf is angry or not.
*/
public void setAngry(boolean p_70916_1_)
{
byte b0 = this.dataWatcher.getWatchableObjectByte(16);
if (p_70916_1_)
{
this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 | 2)));
}
else
{
this.dataWatcher.updateObject(16, Byte.valueOf((byte)(b0 & -3)));
}
}
public EntityWolf createChild(EntityAgeable p_90011_1_)
{
EntityWolf entitywolf = new EntityWolf(this.worldObj);
String s = this.func_152113_b();
if (s != null && s.trim().length() > 0)
{
entitywolf.func_152115_b(s);
entitywolf.setTamed(true);
}
return entitywolf;
}
public void func_70918_i(boolean p_70918_1_)
{
if (p_70918_1_)
{
this.dataWatcher.updateObject(19, Byte.valueOf((byte)1));
}
else
{
this.dataWatcher.updateObject(19, Byte.valueOf((byte)0));
}
}
/**
* Returns true if the mob is currently able to mate with the specified mob.
*/
public boolean canMateWith(EntityAnimal p_70878_1_)
{
if (p_70878_1_ == this)
{
return false;
}
else if (!this.isTamed())
{
return false;
}
else if (!(p_70878_1_ instanceof EntityWolf))
{
return false;
}
else
{
EntityWolf entitywolf = (EntityWolf)p_70878_1_;
return !entitywolf.isTamed() ? false : (entitywolf.isSitting() ? false : this.isInLove() && entitywolf.isInLove());
}
}
public boolean func_70922_bv()
{
return this.dataWatcher.getWatchableObjectByte(19) == 1;
}
/**
* Determines if an entity can be despawned, used on idle far away entities
*/
protected boolean canDespawn()
{
return !this.isTamed() && this.ticksExisted > 2400;
}
public boolean func_142018_a(EntityLivingBase p_142018_1_, EntityLivingBase p_142018_2_)
{
if (!(p_142018_1_ instanceof EntityCreeper) && !(p_142018_1_ instanceof EntityGhast))
{
if (p_142018_1_ instanceof EntityWolf)
{
EntityWolf entitywolf = (EntityWolf)p_142018_1_;
if (entitywolf.isTamed() && entitywolf.getOwner() == p_142018_2_)
{
return false;
}
}
return p_142018_1_ instanceof EntityPlayer && p_142018_2_ instanceof EntityPlayer && !((EntityPlayer)p_142018_2_).canAttackPlayer((EntityPlayer)p_142018_1_) ? false : !(p_142018_1_ instanceof EntityHorse) || !((EntityHorse)p_142018_1_).isTame();
}
else
{
return false;
}
}
}
pocitac770:12.8.2016 13:22
Jo, teď to chápu "Add cast to method reciever"..
method reciever, tím je myšleno to
.func_70907_r().setSitting(true), normálně je ta metoda na
objektu typu EntityTameable, ale překladač dostal typ Object, tak chce mít
jistotu, že ten objekt je opravdu EntityTameable, protože to byl původně
tento objekt, ale máš uloženého pouze jeho předka, tak ho můžeš
"odmaskovat" (navenek to je Object, ale vnitřně se to chová jako
EntityTameable). Toto odmaskování se dělá přes tzn. "cast" (nevím, jak to
přeložit do čestiny), který vypadá takto:
(TridaA)instanceTridyB
kde A dědí z B. Pokud chceš využít metodu třídy A, tak ji musíš opět "obalit" závorkami
((TridaA)instanceTridyB).nejakaMetodaTridyA()
A pokud tu instanci nezískáváš přímo, tak jsou víceméně taktéž povinné, aby se vědělo, na které části toho statementu chceš cast provést (již tvůj konkrétní příklad)
((EntityTameable)werca.EntityTameable).func_70907_r().setSitting(true);
Zároveň tě chci upozornit na to, že toto:
public Object EntityTameable;
je jako artibut absolutní hloupost, když použiješ jako datový typ základní Object, protože nemůžeš dosledovat, co tam bude uloženo, protože tam chceš mít EntityTameable, tak bys ho měl mít taktéž nadefinovaný jako datový typ. (Což by řešilo náš problém s castem, ale...) Navíc, pokud jde o toto vnější volání, tak nemusíš mít přímo onen typ, stačí pouze třída, co z něj dědí, protože získává všechny původní metody (je divné získávat přes atribut instance instanci samotnou, jenom v jiné podobě). Jak se na to koukám, vypadá to, že "programuješ" bez větších znalostí OOP podle rádoby tutoriálů z internetu, ano, jsou dobré, ale pouze ve chvíli, když chápeš, co se tam píše, a jak to funguje, protože bez toho skončíš na výsledcích tutoriálu a nebudeš umět udělat něco kreativního. Pokud jsi zatím neudělal, tak si nejprve přečti zdejší tutoriály o OOP, dozvíš se tam toho hodně a alespoň nebudeš tápat při programování.
Dr.umělec:12.8.2016 14:07
Děkuji mockrát za vysvětlení toho cast kdybys chtěl tak ti za odměnu dám nějaký random key na steam . Ale ted to hází error v konzoli a když ho rozkliknu ,tak to poukazuje na ten tvůj příklad Ano OOP trochu znám ,ale né moc.
pocitac770:12.8.2016 17:45
Víš co? Už se to tu moc rozrůstá, soukromka...
Atrament, díky, jednoduché, ale zrovna to mě nenapadlo
+20 Zkušeností
+2,50 Kč
Zobrazeno 21 zpráv z 21.