利用Forge API开发联机MOD【基础篇】【第七章】
改善你制作的方块的功能
作者:yuxuanchiadm
索引贴地址:http://www.mcbbs.net/thread-38211-1-1.html
请确定你已经阅读完成第六章的内容:
http://www.mcbbs.net/thread-38526-1-1.html
否则不要阅读此贴!
序:
在上一章里,我们创建了一个极不完善的刷怪笼方块,而我们的目标是制作一个能够自定义所刷生物和刷怪间隔的高级刷怪笼。所以,在这一章里,首先让我们让这个方块具有基本的刷怪功能吧!:)。
使你的MOD具有基本的刷怪功能:
首先,刷怪笼需要一个继承自TileEntity的子类,用于储存所刷生物和刷怪间隔和刷新间隔计数。
/**知识点:什么是TileEntity
TileEntity也能算一种实体,只不过它是一种特殊的实体,而且不继承自Entity,用于记录方块的附加信息,比如箱子里的物品等,它与方块紧密相连,另外还可以对这个实体进行渲染。
**/
在myFirstMod包下新建包TileEntity,再新建一个类,命名为TileEntityAdvancedMobSpawner,出于简单考虑,继承自TileEntityMobSpawner,输入以下内容:
- package myFirstMod.TileEntity;
- import java.lang.reflect.Field;
- import net.minecraft.entity.Entity;
- import net.minecraft.entity.EntityList;
- import net.minecraft.tileentity.TileEntityMobSpawner;
- public class TileEntityAdvancedMobSpawner extends TileEntityMobSpawner
- {
- private Field minSpawnDelayField;
- private Field maxSpawnDelayField;
- private Field cachedEntity;
- private Field spawnerTags;
- private Field mobID;
- public TileEntityAdvancedMobSpawner()
- {
- Class<TileEntityMobSpawner> TileEntityMobSpawnerClass =TileEntityMobSpawner.class;
- try
- {
- minSpawnDelayField = TileEntityMobSpawnerClass.getDeclaredField("minSpawnDelay");
- minSpawnDelayField.setAccessible(true);
- maxSpawnDelayField = TileEntityMobSpawnerClass.getDeclaredField("maxSpawnDelay");
- maxSpawnDelayField.setAccessible(true);
- cachedEntity = TileEntityMobSpawnerClass.getDeclaredField("field_92017_j");
- cachedEntity.setAccessible(true);
- spawnerTags = TileEntityMobSpawnerClass.getDeclaredField("spawnerTags");
- spawnerTags.setAccessible(true);
- mobID = TileEntityMobSpawnerClass.getDeclaredField("mobID");
- mobID.setAccessible(true);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public void setMobID(String id)
- {
- try
- {
- mobID.set(this, id);
- cachedEntity.set(this, null);
- spawnerTags.set(this, null);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public String getMobID()
- {
- try
- {
- if(((Entity)cachedEntity.get(this)) != null)
- {
- return EntityList.getEntityString(((Entity)cachedEntity.get(this)));
- }
- else
- {
- return func_92015_a();
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- return null;
- }
- }
- public int getSpawnDelay()
- {
- try
- {
- int max = ((Integer)maxSpawnDelayField.get(this)).intValue();
- int min = ((Integer)minSpawnDelayField.get(this)).intValue();
- return min + (max - min) / 2;
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return 0;
- }
- public void setSpawnDelay(int value)
- {
- try
- {
- maxSpawnDelayField.set(this, value);
- minSpawnDelayField.set(this, value);
- if(delay > value)
- {
- delay = value;
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public int getMaxSpawnDelay()
- {
- try
- {
- return ((Integer)maxSpawnDelayField.get(this)).intValue();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return 0;
- }
- public int getMinSpawnDelay()
- {
- try
- {
- return ((Integer)minSpawnDelayField.get(this)).intValue();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- return 0;
- }
- public void setMaxSpawnDelay(int value)
- {
- try
- {
- maxSpawnDelayField.set(this, value);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public void setMinSpawnDelay(int value)
- {
- try
- {
- minSpawnDelayField.set(this, value);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
以上的公共实例方法主要是为了获取、设置刷怪间隔和所刷怪物,包括一些通过反射来越权访问。
然后,在mod_myFirstMod的load方法里注册它:
- TileEntity.addMapping(TileEntityAdvancedMobSpawner.class, "AdvancedMobSpawner");
现在,保存你的代码,并编译运行,你就可以用一个刷怪笼和8个钻石得到一个高级刷怪笼,虽然和普通刷怪笼看上去没啥区别。
总结:
这一章里,我们让我们的高级刷怪笼已经有了普通刷怪笼的功能,下一章里,我们将要为刷怪笼能够实现更多功能做准备,建立我们的网络通信框架!