[解決済み]【Minecraft 1.7.10 Forge】特定のアイテム属性を持っていないアイテムを死亡時にドロップさせずに削除したい

Modやプラグインの制作/開発に関する質問はこちらへどうぞ。
Ho9tocraft
ID: 35D5I4WA9G
記事: 4
登録日時: 2019年11月26日(火) 14:57
Minecraft ID: ho9tocraft

[解決済み]【Minecraft 1.7.10 Forge】特定のアイテム属性を持っていないアイテムを死亡時にドロップさせずに削除したい

投稿記事 by Ho9tocraft » 2022年7月31日(日) 20:26

タイトル通りです。
NBTに登録してもいいですし、イベントハンドラの使用を行っても問題ないので、この条件に沿ったソースコードを書いてくれませんか?
・特定のディメンションで、「isChaosAgeLosting」のNBT/変数がfalseのもの、もしくはそのNBT/変数が存在しないすべてのアイテム(他Mod追加含む)をインベントリから削除してから除外する
 【特定のディメンションについて】
  主にネザー。ただダイヤモンド装備やクアンタムなどで固めて入っていき、無双することができる状態を防ぎたいからです。
 【特定のディメンションでロストしないバニラアイテム】
 ありません。
 【特定のディメンションでロストしない他Mod装備】
 ありません。状況次第では(GregTech 5 Unofficial導入時)クアンタムをロストすることになります。
0
最後に編集したユーザー Ho9tocraft [ 2023年3月12日(日) 11:47 ], 累計 1 回



Tags:

アバター
おがさくら
ID: 2B6LCHA53W
記事: 17
登録日時: 2021年10月06日(水) 20:18
お住まい: あいち
Minecraft ID: ogasakura
いいねされた回数: 3回
連絡する:

Re: 【Minecraft 1.7.10 Forge】特定のアイテム属性を持っていないアイテムを死亡時にドロップさせずに削除したい

投稿記事 by おがさくら » 2022年8月06日(土) 23:23

コード: 全て選択

@SubscribeEvent
public void LostItem(PlayerDropsEvent event) {
	//プレイヤーのバイオームIDが-1(ネザー)でなければ何もしない
	if(event.entityPlayer.worldObj.provider.dimensionId!=-1)
		return;
	//event.dropsで死亡時にドロップするEntityItemのリストを取得
	for(EntityItem entity:event.drops) {
		//EntityItemからItemStackを取得
		ItemStack stack=entity.getEntityItem();
		//スタックのnullチェックとNBTタグ所持チェック
		if(stack!=null){
			if(!stack.hasTagCompound()) { //NBTタグがなければロスト
				//ドロップアイテムを死亡判定にする(=消滅する)
				entity.setDead();
				//以降はカット
				continue;
			}
			
			//NBT取得
			NBTTagCompound nbt=stack.getTagCompound();
			//所望のNBTタグを調べ、条件に合うかを判定
			if(!nbt.hasKey("isChaosAgeLosting")||!nbt.getBoolean("isChaosAgeLosting")){	
				entity.setDead();
			}
		}
	}
}
これをMinecraftForge.EVENT_BUS.registerで登録すればできると思う

テストにてネザーで死亡した際、指定NBTタグが付いており値がtrueのものだけドロップしていることを確認済み
他Modのアイテムは試してないけどEntityItemとしてドロップすればちゃんとロストするかと
0
桜と月をこよなく愛する自称プログラマ&イラストレータ
1.2.5&1.7.10マイクラModder・クラフター

Modを使うときはこれを読んでください↓
https://docs.google.com/document/d/18oV ... sp=sharing
現在更新しておりません

Ho9tocraft
ID: 35D5I4WA9G
記事: 4
登録日時: 2019年11月26日(火) 14:57
Minecraft ID: ho9tocraft

Re: [解決済み]【Minecraft 1.7.10 Forge】特定のアイテム属性を持っていないアイテムを死亡時にドロップさせずに削除したい

投稿記事 by Ho9tocraft » 2023年3月12日(日) 11:52

!?
まさかソースコード書いてくれる人がいたとは…!
ありがとうございます!ですけど…申し訳ありません!この記事を投稿した数週~数ヶ月後に、当該コードに類似したソースコードを書き上げることに成功していました…。
以下、当該部分になります。

コード: 全て選択

	@SubscribeEvent
	public void onPlayerDeathAndDrops(LivingDropsEvent event) {
		if (event.entityLiving instanceof EntityPlayer) {
			EntityPlayer player = (EntityPlayer)event.entityLiving;
			if (player.worldObj.provider.dimensionId == -1 || player.worldObj.provider.dimensionId == 1) {
				for (EntityItem itemEntity : event.drops) {
					if (itemEntity.getEntityItem().getItem() instanceof IItemRejectLost) {
						if (((IItemRejectLost)itemEntity.getEntityItem().getItem()).isCAAttributes()) {
							continue;
						}
					}
					NBTTagList enchList = ItemNBTHelper.getList(itemEntity.getEntityItem(), "ench", 10, true);
					boolean hasEnchCA = false;
					if (enchList != null) {
						for (int i = 0; i < enchList.tagCount(); i++) {
							NBTTagCompound enchSingle = enchList.getCompoundTagAt(i);
							if (enchSingle.getInteger("id") == ConfigHandler.EnchantmentCA && ConfigHandler.EnchantmentCA >= 0) {
								hasEnchCA = true;
								break;
							}
						}
						if (hasEnchCA) continue;
					}
					itemEntity.setDead();
				}
			} else {
				for (EntityItem itemEntity : event.drops) {
					if (itemEntity.getEntityItem().getItem() instanceof IItemRejectLost) {
						if (!((IItemRejectLost)itemEntity.getEntityItem().getItem()).isDyingInOverworldTypes()) {
							continue;
						}
					}
					NBTTagList enchList = ItemNBTHelper.getList(itemEntity.getEntityItem(), "ench", 10, true);
					boolean hasEnchCA = false;
					if (enchList != null) {
						for (int i = 0; i < enchList.tagCount(); i++) {
							NBTTagCompound enchSingle = enchList.getCompoundTagAt(i);
							if (enchSingle.getInteger("id") == ConfigHandler.EnchantmentCA && ConfigHandler.EnchantmentCA >= 0) {
								hasEnchCA = true;
								break;
							}
						}
						if (!hasEnchCA) continue;
					}
					itemEntity.setDead();
				}
			}
		}
	}
0

返信する