Портал, как и все блок - final, переназначать их нельзя, а класс ItemTracker в 1.6.4 я найти не смог.Dragon2488 написал(а):никакой. Только блок портала на свой изменять. Это делать либо ItemTracker'ом, либо просто Block.enderPortal = твойБлок. Но это не очень совместимо будет с другими модами, так что лучше 2 вариантом не пользоваться.
Могу я получить подсказку? С рефлекшеном понятное дело, раньше не работал.anti344 написал(а):Можно достать Field блока порлала рефлекшеном и тем же рефлекшеном изменить в нем значение "финальный" на значение "не финальный".
...
private static Block mod;
public static void loadBlocks() {
try {
Field cPortal = mod.getClass().getDeclaredField("endPortal");
cPortal.set(new ChangedPortalBlock(119, Material.portal), 0);
} catch (NoSuchFieldException e) {} catch (SecurityException e) {} catch (IllegalArgumentException e) {} catch (IllegalAccessException e) {}
...
public static boolean replaceBlock(Block toReplace, Class<? extends Block> blockClass){
Field modifiersField=null;
try{
modifiersField=Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
for(Field field:Blocks.class.getDeclaredFields()){
if (Block.class.isAssignableFrom(field.getType())){
Block block=(Block)field.get(null);
if (block==toReplace){
String registryName=Block.blockRegistry.getNameForObject(block);
int id=Block.getIdFromBlock(block);
ItemBlock item=(ItemBlock)Item.getItemFromBlock(block);
System.out.println("Replacing block - "+id+"/"+registryName);
Block newBlock=blockClass.newInstance();
FMLControlledNamespacedRegistry<Block> registry=GameData.blockRegistry;
registry.putObject(registryName,newBlock);
Field map=RegistryNamespaced.class.getDeclaredFields()[0];
map.setAccessible(true);
((ObjectIntIdentityMap)map.get(registry)).func_148746_a(newBlock,id);
map=FMLControlledNamespacedRegistry.class.getDeclaredField("namedIds");
map.setAccessible(true);
((BiMap)map.get(registry)).put(registryName,id);
field.setAccessible(true);
int modifiers=modifiersField.getInt(field);
modifiers&=~Modifier.FINAL;
modifiersField.setInt(field,modifiers);
field.set(null,newBlock);
Field itemblock=ItemBlock.class.getDeclaredFields()[0];
itemblock.setAccessible(true);
modifiers=modifiersField.getInt(itemblock);
modifiers&=~Modifier.FINAL;
modifiersField.setInt(itemblock,modifiers);
itemblock.set(item,newBlock);
System.out.println("Check field: "+field.get(null).getClass());
System.out.println("Check registry: "+Block.blockRegistry.getObjectById(id).getClass());
System.out.println("Check item: "+((ItemBlock)Item.getItemFromBlock(newBlock)).field_150939_a.getClass());
}
}
}
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
}
Как много незнакомых классов...f1rSt1k написал(а):Есть у меня такой код, вот только пашет он только на 1.7.2.
Код:public static boolean replaceBlock(Block toReplace, Class<? extends Block> blockClass){ Field modifiersField=null; try{ modifiersField=Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); for(Field field:Blocks.class.getDeclaredFields()){ if (Block.class.isAssignableFrom(field.getType())){ Block block=(Block)field.get(null); if (block==toReplace){ String registryName=Block.blockRegistry.getNameForObject(block); int id=Block.getIdFromBlock(block); ItemBlock item=(ItemBlock)Item.getItemFromBlock(block); System.out.println("Replacing block - "+id+"/"+registryName); Block newBlock=blockClass.newInstance(); FMLControlledNamespacedRegistry<Block> registry=GameData.blockRegistry; registry.putObject(registryName,newBlock); Field map=RegistryNamespaced.class.getDeclaredFields()[0]; map.setAccessible(true); ((ObjectIntIdentityMap)map.get(registry)).func_148746_a(newBlock,id); map=FMLControlledNamespacedRegistry.class.getDeclaredField("namedIds"); map.setAccessible(true); ((BiMap)map.get(registry)).put(registryName,id); field.setAccessible(true); int modifiers=modifiersField.getInt(field); modifiers&=~Modifier.FINAL; modifiersField.setInt(field,modifiers); field.set(null,newBlock); Field itemblock=ItemBlock.class.getDeclaredFields()[0]; itemblock.setAccessible(true); modifiers=modifiersField.getInt(itemblock); modifiers&=~Modifier.FINAL; modifiersField.setInt(itemblock,modifiers); itemblock.set(item,newBlock); System.out.println("Check field: "+field.get(null).getClass()); System.out.println("Check registry: "+Block.blockRegistry.getObjectById(id).getClass()); System.out.println("Check item: "+((ItemBlock)Item.getItemFromBlock(newBlock)).field_150939_a.getClass()); } } } }catch(Exception e){ e.printStackTrace(); return false; } return true; } }
Block.blocksList[Block.endPortal.blockID] = null;
ChangedPortalBlock = new ChangedPortalBlock(119, Material.portal);
GameRegistry.registerBlock(ChangedPortalBlock, "endPortal");
Block.blocksList[Block.endPortal.blockID] = ChangedPortalBlock;
@Override
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
{
if (entity.ridingEntity == null && entity.riddenByEntity == null && !world.isRemote)
{
if(entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) entity;
player.addChatMessage("I18n.getString("message.warning.toend"));
}
}
}
Сделал так, т.к. на один два тика приходится одно время:anti344 написал(а):if(world.getTotalWorldTime(или как-то так) % 100 == 0)
[merge_posts_bbcode]Добавлено: 08.05.2014 18:00:33[/merge_posts_bbcode]
Ванильный ищет не только в стандартных файлах, он ищет во всех правильным образом размещённых файлах.
int lasttime = 1;
@Override
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
{
if (entity.ridingEntity == null && entity.riddenByEntity == null && !world.isRemote)
{
if(entity instanceof EntityPlayer) {
int time = (int) world.getWorldTime() % 100;
if(world.getWorldTime() % 100 == 0 && time != lasttime) {
EntityPlayer player = (EntityPlayer) entity;
player.addChatMessage(I18n.getString("message.warning.toend"));
}
lasttime = time;
}
}
}