Modding会 in Kyoto

26
Mob(というかEntity)のいろいろ @ayamitsu0321 環境: Minecraft 1.7.10 forge-1.7.10-10.13.0.1199

Transcript of Modding会 in Kyoto

Page 1: Modding会 in Kyoto

Mob(というかEntity)のいろいろ@ayamitsu0321

環境:Minecraft 1.7.10forge-1.7.10-10.13.0.1199

Page 2: Modding会 in Kyoto

• EntityとItemStackの相互変換(3-5)• DataWatcherを用いた同期(6-10)• entityIdを用いた同期(11-14)• EntityListの説明(15-16)• Eventの種類(17-21)• RenderManagerでの描画(22-23)• Modelの非表示(24-25)

目次

Page 3: Modding会 in Kyoto

EntityとItemStackの相互変換共通点

Page 4: Modding会 in Kyoto

EntityとItemStackの保存の流れ

net.minecraft.entity.Entitynet.minecraft.nbt.NBTTagCompoundnet.minecraft.item.ItemStack

Page 5: Modding会 in Kyoto

デモ

Page 6: Modding会 in Kyoto

DataWatcherを用いた同期

Page 7: Modding会 in Kyoto

net.minecraft.entity.DataWatcher

• byte• short• int• float• ItemStack• ChunkCoordinates

使える型

コード

Page 8: Modding会 in Kyoto

初期化

コード

Page 9: Modding会 in Kyoto

同期の流れコード

Page 10: Modding会 in Kyoto

注意点• Indexが重複しないようにする

• 型の不一致や予期せぬ誤動作を起こす• byteやshortなどのintをキャストしていれるものは確実にキャストする

• ItemStackやChunkCoordinatesを入れる場合、nullは絶対にいれない

• NullPointerExceptionがでる• 既存のEntityに対して外部から新たにIndex追加してはいけない

• 他のMODが同じようなことをしている可能性(杞憂?)

Page 11: Modding会 in Kyoto

entityIdを用いた同期

Page 12: Modding会 in Kyoto

ServerとClientでentityIdは共通

同期できる(真理)

Page 13: Modding会 in Kyoto

同期の流れ

WorldのloadedEntityListからentityIdの一致するEntityを探す

Page 14: Modding会 in Kyoto

注意点• setEntityIdは使わない• タイミングによってはServerとClientの接続が確立されてない場合があるので注意する

• 例:EntityJoinWorldEvent• Packet送信後、返ってくるまで送信し続けるなどの対処が必要

• EntityLivingBase継承の場合はLivingEvent.LivingUpdateEventが使える

Page 15: Modding会 in Kyoto

EntityListの説明

Page 16: Modding会 in Kyoto

net.minecraft.entity.EntityList

• Entityに関する名前、Class、IDの情報がMapで保持されている

• Entityからそれらの情報がとれる• addMappingを使えば情報を上書きできる• 名前、Class、あるいはIDのいずれかの情報から他の情報がとれる

• Entityのインスタンスの生成をやってくれる

コード

Page 17: Modding会 in Kyoto

Eventの種類

Page 18: Modding会 in Kyoto

net.minecraftforge.event.entity• EntityEvent.EntityConstructing

• コンストラクタで呼ばれる• EntityEvent.CanUpdate

• 調査不足• EntityEvent.EnteringChunk

• ChunkにEntityが追加されたときによばれる• EntityJoinWorldEvent

• WorldのspawnEntityInWorldでよばれる• EntityStruckByLightningEvent

• 雷がEntityにあたったときによばれる• PlaySoundAtEntityEvent

• Entityで音が鳴らされるときによばれる

Page 19: Modding会 in Kyoto

net.minecraftforge.event.entity.living

• EnderTeleportEvent• Endermanがテレポート、あるいはEnder pearlを使ってテレポートしたときによばれる

• LivingAttackEvent• 攻撃を受けたときによばれる

• LivingDeathEvent• 死んだときによばれる

• LivingDropsEvent• 死んでアイテムをドロップするときによばれる

• LivingEvent.LivingUpdateEvent• tick処理(onUpdate)でよばれる

Page 20: Modding会 in Kyoto

• LivingEvent.LivingJumpEvent• ジャンプしたときによばれる

• LivingFallEvent• 落ちたときによばれる

• LivingHurtEvent• ダメージを与えられたときによばれる

• LivingPackSizeEvent• 調査不足

• LivingSetAttackTargetEvent• 攻撃対象を設定したときによばれる

• LivingSpawnEvent• スポーンしたときによばれる

• LivingSpawnEvent.CheckSpawn• スポーンする直前にMobをスポーンさせる設定をする

Page 21: Modding会 in Kyoto

• LivingEvent.SpecialSpawn• スポーナーでスポーンさせるときによばれる

• LivingEvent.AllowDespawn• tickで処理、その時点でデスポーンを許可するかどうかを設定できる

• 即座にデスポーンさせるということではない

• ZombieEvent.SummonAidEvent• ゾンビの村襲撃イベントでよばれる?• 調査不足

Page 22: Modding会 in Kyoto

RenderManagerでの描画

Page 23: Modding会 in Kyoto

net.minecraft.client.renderer.entity.RenderManager

• renderEntityWithPosYawにEntityと座標などをぶちこめばよい

• GUIやTileEntity、IItemRendererなどどこでも使える

• 引数の最後のfloatは0.0Fで大丈夫• RenderBoatでは0.0625Fいれてる• 調査不足

Page 24: Modding会 in Kyoto

Modelの非表示

Page 25: Modding会 in Kyoto

• Entityは基本的にModelをRenderで描画• ModelRendererのisHiddenをtrueにすると非表示にできる

デモ

Page 26: Modding会 in Kyoto

おわり