alchemistarkの日記

やったことのメモ

Propの出現と破壊可能にする方法

ゴリゴリ書いてたのでとりあえず全部貼る。

public Action:Cmd_prop(client, args){

	new ent = CreateEntityByName("prop_dynamic");
	new filter;
	new String:temp[255];
	

	//フィルター関係///////////////////////////
	
	while ((filter = FindEntityByClassname(filter, "filter_activator_tfteam")) != -1){
		GetEntPropString(filter, Prop_Data, "m_iGlobalname", temp,255);
		if(StrEqual(temp,"prop_filter")){
			//既にフィルターが生成されていた場合、削除する
			AcceptEntityInput(filter, "Kill");
		}
	}
	
	filter = CreateEntityByName("filter_activator_tfteam");	//フィルターを作成する
	SetEntProp(filter, Prop_Data, "m_iTeamNum",TFTeam_Blue);	//フィルター対象チームを設定
	
	DispatchSpawn(filter);	//スポーンさせる	
	
	//フィルター名を設定する
	SetEntPropString(filter, Prop_Data, "m_iGlobalname", "prop_filter");

	//Propにフィルターを設定する
	//フィルター名とフィルターEntityが両方必要?
	SetEntPropString(ent, Prop_Data, "m_iszDamageFilterName","prop_filter");
	
	//PropにフィルターEntityを設定
	SetEntPropEnt(ent, Prop_Data, "m_hDamageFilter",filter);
	
	//Prop関係//////////////////////////////////////
	
	//Propのダメージイベントをフックする
	HookSingleEntityOutput(ent,"OnTakeDamage",EntityHook,false);
	
	//Propにモデルを設定する
	SetEntPropString(ent, Prop_Data, "m_ModelName", "models/props_badlands/barrel_flatbed01.mdl");
	//衝突判定を設定
	SetEntProp(ent, Prop_Data, "m_nSolidType",6);
	
	//Propをスポーンさせる
	DispatchSpawn(ent);
	
	//Propのヘルスを設定する
	SetEntProp(ent, Prop_Data, "m_iHealth", 200);
	
	//Propがダメージを受けるようにする
	SetEntProp(ent, Prop_Data, "m_takedamage", 2, 1);	//Mortal
	
	
	//適当な位置に出現させる
	new float:vec[3];
	GetClientAbsOrigin(client, vec);
	TeleportEntity(ent, vec, NULL_VECTOR, NULL_VECTOR);
	
}

public EntityHook(const char[] output, int caller, int activator, float delay){
	PrintToChatAll("%d",GetEntProp(caller, Prop_Data, "m_iHealth"));
}

大体コメントの通り
寝て良いよ

SetEntProp(ent, Prop_Data, "m_nSolidType",6);の値が6なのは何故か分かってない
一応プロパティのCollisionsの値がUse VPhysicsの時6になる。
KeyValueのキー名はsolid。

破壊可能にするだけならヘルスを設定してMortal化するだけでいいはず
ただし破壊された時何も表示せずただ消えるだけなので、破壊時にパーティクルを表示する等の配慮が必要。

フィルターは指定チームのみダメージを与えられるように設定してるので、誰でも壊せるならフィルター自体不要
なるべくフィルターには変な名前付けてマップ既存のフィルターと重複しないように注意した方がいいと思うけど大丈夫じゃないかな

あと言うまでもないけどTeleportEntityの座標がクライアントの位置なのでそのまま呼ぶと自分がPropにハマるから注意。

prop_dynamic - Valve Developer Community
filter_activator_tfteam - Valve Developer Community


追記
prop_physics_overrideを呼び出した場合、何故かHookSingleEntityOutputが上手く動作しないので
HookEntityOutputを使用した方がいいかも。この場合Entityの番号を保存しておくかユニークな名称を付けておく必要があるのでかなりめんどくさい。

prop_physics_override - Valve Developer Community

ていうかね!違いが全然分かってないんだよね!!!
prop_physics→モデル側で対応が必要
prop_physics_multiplayer→わからない モデルが動作中はプレイヤーがすり抜けてしまう?(モデルが静止するとCollisionが復活するのでプレイヤーが埋まる)
prop_physics_override→physics非対応モデルをphysics化?以降Entityのクラス名はprop_physicsになる
prop_physics_respawnable→知らない子です