提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
32行目: 32行目:
  
 
//1.8のforgeを指定
 
//1.8のforgeを指定
@Mod(modid = "SampleMod",  
+
@Mod(modid = "SampleMod", name = "SampleMod", version = "1.0", dependencies = "required-after:Forge@[11.14.0.1296,)", useMetadata = true)
    name = "SampleMod",  
 
    version = "1.0",  
 
    dependencies = "required-after:Forge@[11.14.0.1296,)",  
 
    acceptedMinecraftVersions = "[1.8,1.8.9]",
 
    useMetadata = true)
 
 
public class SampleMod {
 
public class SampleMod {
 
     @SidedProxy(clientSide = "sampleMod.ClientProxy", serverSide = "sampleMod.CommonProxy")
 
     @SidedProxy(clientSide = "sampleMod.ClientProxy", serverSide = "sampleMod.CommonProxy")
 
     public static CommonProxy proxy;
 
     public static CommonProxy proxy;
 +
    //Player毎のIExtendedEntityPropertiesを保存するMap。ダイヤモンド演算子はJava7以降なので注意。
 +
    private static final Map<String, NBTTagCompound> extendedEntityData = new HashMap<>();
 +
 
     @EventHandler
 
     @EventHandler
 
     public void preInit(FMLPreInitializationEvent event) {
 
     public void preInit(FMLPreInitializationEvent event) {
49行目: 47行目:
 
     @EventHandler
 
     @EventHandler
 
     public void init(FMLInitializationEvent event) {
 
     public void init(FMLInitializationEvent event) {
      //二箇所に登録するので、先にインスタンスを生成しておく。
 
        SampleEntityPropertiesEventHandler sampleEntityPropertiesEventHandler = new SampleEntityPropertiesEventHandler();
 
 
         //Forge Eventの登録。EntityEvent.EntityConstructingとLivingDeathEventとEntityJoinWorldEvent
 
         //Forge Eventの登録。EntityEvent.EntityConstructingとLivingDeathEventとEntityJoinWorldEvent
         MinecraftForge.EVENT_BUS.register(sampleEntityPropertiesEventHandler);
+
         MinecraftForge.EVENT_BUS.register(this);
         //FML Eventの登録。PlayerRespawnEvent
+
         //FML Eventの登録。PlayerChangedDimensionEventとPlayerRespawnEvent
         FMLCommonHandler.instance().bus().register(sampleEntityPropertiesEventHandler);
+
         FMLCommonHandler.instance().bus().register(this);
 
     }
 
     }
}
 
</source>
 
 
===SampleEntityPropertiesEventHanderクラス===
 
<source lang = "java">
 
package com.example.examplemod;
 
 
import net.minecraft.entity.player.EntityPlayer;
 
import net.minecraft.entity.player.EntityPlayerMP;
 
import net.minecraft.nbt.NBTTagCompound;
 
import net.minecraftforge.common.IExtendedEntityProperties;
 
import net.minecraftforge.event.entity.EntityEvent;
 
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
 
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 
 
public class SampleEntityPropertiesEventHandler {
 
  
 +
    @SubscribeEvent
 
     /*IExtendedEntityPropertiesを登録する処理を呼び出す*/
 
     /*IExtendedEntityPropertiesを登録する処理を呼び出す*/
    @SubscribeEvent
 
 
     public void onEntityConstructing(EntityEvent.EntityConstructing event) {
 
     public void onEntityConstructing(EntityEvent.EntityConstructing event) {
 
         if (event.entity instanceof EntityPlayer) {
 
         if (event.entity instanceof EntityPlayer) {
             ExtendedPlayerProperties.register((EntityPlayer) event.entity);
+
             ExtendedPlayerProperties.register((EntityPlayer)event.entity);
 +
        }
 +
    }
 +
 
 +
    @SubscribeEvent
 +
    /*死亡時に呼ばれるイベント。ここで、IExtendedEntityPropertiesを保存する処理を呼び出す*/
 +
    public void onLivingDeathEvent(LivingDeathEvent event)  {
 +
        if (event.entityLiving instanceof EntityPlayer && !event.entity.worldObj.isRemote) {
 +
            NBTTagCompound playerData = new NBTTagCompound();
 +
            (event.entity.getExtendedProperties(ExtendedPlayerProperties.EXT_PROP_NAME)).saveNBTData(playerData);
 +
            storeEntityData(((EntityPlayer) event.entity).getGameProfile().getId().toString(), playerData);
 
         }
 
         }
 
     }
 
     }
85行目: 74行目:
 
     /*ワールドに入った時に呼ばれるイベント。ここでIExtendedEntityPropertiesを読み込む処理を呼び出す*/
 
     /*ワールドに入った時に呼ばれるイベント。ここでIExtendedEntityPropertiesを読み込む処理を呼び出す*/
 
     public void onEntityJoinWorld(EntityJoinWorldEvent event)  {
 
     public void onEntityJoinWorld(EntityJoinWorldEvent event)  {
         if (event.world.isRemote && event.entity instanceof EntityPlayer) {
+
         if (event.entity.worldObj.isRemote && event.entity instanceof EntityPlayer) {
 
             EntityPlayer player = (EntityPlayer)event.entity;
 
             EntityPlayer player = (EntityPlayer)event.entity;
 
             PacketHandler.INSTANCE.sendToServer(new MessagePlayerJoinInAnnouncement(player));
 
             PacketHandler.INSTANCE.sendToServer(new MessagePlayerJoinInAnnouncement(player));
92行目: 81行目:
  
 
     @SubscribeEvent
 
     @SubscribeEvent
     //Dimension移動時や、リスポーン時に呼ばれるイベント。古いインスタンスと新しいインスタンスの両方を参照できる。
+
     /*リスポーン時に呼ばれるイベント。Serverとの同期を取る*/
     public void onClonePlayer(net.minecraftforge.event.entity.player.PlayerEvent.Clone event) {
+
     public void respawnEvent(PlayerEvent.PlayerRespawnEvent event) {
        //死亡時に呼ばれてるかどうか
+
         if (!event.player.worldObj.isRemote) {
         if (event.wasDeath) {
+
             PacketHandler.INSTANCE.sendTo(new MessagePlayerProperties(event.player), (EntityPlayerMP)event.player);
            //古いカスタムデータ
 
            IExtendedEntityProperties oldEntityProperties = event.original.getExtendedProperties(ExtendedPlayerProperties.EXT_PROP_NAME);
 
             //新しいカスタムデータ
 
            IExtendedEntityProperties newEntityProperties = event.entityPlayer.getExtendedProperties(ExtendedPlayerProperties.EXT_PROP_NAME);
 
            NBTTagCompound playerData = new NBTTagCompound();
 
            //データの吸い出し
 
            oldEntityProperties.saveNBTData(playerData);
 
            //データの書き込み
 
            newEntityProperties.loadNBTData(playerData);
 
 
 
 
         }
 
         }
 
     }
 
     }
  
 
     @SubscribeEvent
 
     @SubscribeEvent
     /*リスポーン時に呼ばれるイベント。Serverとの同期を取る*/
+
     /*Dimensionを移動した時に呼ばれるイベント。Serverとの同期を取る*/
     public void respawnEvent(PlayerEvent.PlayerRespawnEvent event) {
+
     public void changedDimension(PlayerEvent.PlayerChangedDimensionEvent event) {
 
         if (!event.player.worldObj.isRemote) {
 
         if (!event.player.worldObj.isRemote) {
 
             PacketHandler.INSTANCE.sendTo(new MessagePlayerProperties(event.player), (EntityPlayerMP)event.player);
 
             PacketHandler.INSTANCE.sendTo(new MessagePlayerProperties(event.player), (EntityPlayerMP)event.player);
 
         }
 
         }
 +
    }
 +
 +
    /*PlayerのIExtendedEntityPropertiesをMapに保存*/
 +
    public static void storeEntityData(String name, NBTTagCompound compound) {
 +
        extendedEntityData.put(name, compound);
 +
    }
 +
 +
    /*PlayerのIExtendedEntityPropertiesをMapから読み込み*/
 +
    public static NBTTagCompound getEntityData(String name) {
 +
        return extendedEntityData.remove(name);
 
     }
 
     }
 
}
 
}
  
 
</source>
 
</source>
 +
 
===ExtendedPlayerPropertiesクラス===
 
===ExtendedPlayerPropertiesクラス===
 
<source lang = "java">
 
<source lang = "java">
145行目: 135行目:
 
     private ItemStack[] sampleItemStacks = new ItemStack[10];
 
     private ItemStack[] sampleItemStacks = new ItemStack[10];
 
     private NBTTagCompound sampleNBTTagCompound = new NBTTagCompound();
 
     private NBTTagCompound sampleNBTTagCompound = new NBTTagCompound();
 +
 +
    /*EntityPlayerインスタンスから外部保存時の固有文字列を返す
 +
    *playernameは変更可能になったので、UUIDに変更 */
 +
    private static String getSaveKey(EntityPlayer player) {
 +
        return player.getGameProfile().getId().toString() + ":" + EXT_PROP_NAME;
 +
    }
  
 
     /*EntityPlayerにIExtendedEntityPropertiesを登録。登録文字列はMOD固有のものを割り当てること*/
 
     /*EntityPlayerにIExtendedEntityPropertiesを登録。登録文字列はMOD固有のものを割り当てること*/
277行目: 273行目:
  
 
</source>
 
</source>
 +
 
===CommonProxyクラス===
 
===CommonProxyクラス===
  
415行目: 412行目:
  
 
     public MessagePlayerJoinInAnnouncement(EntityPlayer player) {
 
     public MessagePlayerJoinInAnnouncement(EntityPlayer player) {
        //PlayerのUUIDを文字列で取得
 
 
         this.uuid = player.getGameProfile().getId().toString();
 
         this.uuid = player.getGameProfile().getId().toString();
 
     }
 
     }
448行目: 444行目:
 
         //UUIDの文字列を受け取る
 
         //UUIDの文字列を受け取る
 
         String uuidString = message.getUuid();
 
         String uuidString = message.getUuid();
 +
        //UUIDからカスタムデータを取得
 +
        NBTTagCompound playerData = SampleMod.getEntityData(uuidString);
 
         EntityPlayer player = ctx.getServerHandler().playerEntity;
 
         EntityPlayer player = ctx.getServerHandler().playerEntity;
         //取得したPlayerが同一UUIDを持つか判定
+
         if (playerData != null) {
        if (player.getGameProfile().getId().toString().equals(uuidString)) {
+
            //プレイヤーのNBTに書き込む
            //クライアント側にデータを送る
+
            (player.getExtendedProperties(ExtendedPlayerProperties.EXT_PROP_NAME)).loadNBTData(playerData);
            return new MessagePlayerProperties(player);
 
 
         }
 
         }
         //UUIDが違っていた場合、同期処理を呼ばない
+
         //クライアント側にデータを送る
         return null;
+
         return new MessagePlayerProperties(player);
 
     }
 
     }
 
}
 
}
466行目: 463行目:
 
ExtendedPlayerProperties.get(playerインスタンス).getSampleInt()という形でデータを呼び出す。<br>
 
ExtendedPlayerProperties.get(playerインスタンス).getSampleInt()という形でデータを呼び出す。<br>
 
ExtendedPlayerProperties.get(playerインスタンス).setSampleInt(sample)という形でデータを書き込む。<br>
 
ExtendedPlayerProperties.get(playerインスタンス).setSampleInt(sample)という形でデータを書き込む。<br>
死亡時等でカスタムデータが初期化されるので、CloneEventでデータを新しいインスタンスに移行し、EntityJoinWorldEventとRespawnEventで、クライアント側にデータを送って同期させている。
+
死亡時等でクライアント側のNBTデータが初期化されるので、LivingDeathEventでデータを保存し、EntityJoinWorldEventで、保存したデータを復帰させる。<br>
 +
PlayerRespawnEventやPlayerChangedDimensionEventでも同期を取っているが、Forgeのビルドによっては修正されているかもしれないので、適宜確認の上、追加削除を行うこと。

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)