Schaden und Schaden machen// Bots

earliboy
Hi, ich sitze in moment an eine Bot Zombie
der Zombie spawnt bissher und folgt mir auch
Jetzt will ich das noch machen das ich schaden bekomme und ich auch schaden an ihm machen kann

so siehts bissher aus

distance = distance(self.origin,botzom.origin);
if(distance < 70)
{

//SCHADEN

if(self.sessionstate != "dead")
{
self iprintlnBold("You were killed by the BotZombie");
botzom delete();
break;
}
wait .2;
continue;
}

Würde mich über jede hilfe freuen smile

MFG Earliboy
earliboy
ok also mich killen geht jez ^^ den rest krieg ich auch noch hin

killplayer(damage,radius)
{
self endon("destroyed_by");
while(true)
{
players=getentarray("player","classname");
for(i=0;i<players.size;i++)
{
if(isdefined(players[i])&&isdefined(players[i].sessionstate)&&players[i
].sessionstate=="playing")
{
if(distancesquared(self.origin,players[i].origin)<radius*radius)
{
trace = bullettrace(self.origin+(0,0,40),players[i].origin+(0,0,40),false,self);
if(trace["fraction"]==1)
players[i] finishplayerdamage(undefined, undefined, damage, 0, "MOD_UNKNOWN", "none", players[i].origin+(0,0,40), (0,0,0), "none", 0);

}
}
}


wait 0.05;
}
}
serthy
also
du brauchst um an einen xmodel schaden zu 'verursachen' die setCanDamage() funktion

die ist aber ziemlich verbuggt und funktioniert nicht immer (fast nie, wennn die überhaupt geht)

also ist selber eine schreiben angesagt

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
damageModel()
{
	bullet = spawn( "script_model", self.origin );
	bullet setModel( "xmodel/tombstone1" );
	bullet.angles = ( 0, 0, 0 );

	bullet setCanDamage(1); // turn damage monitor on
	bullet setContents(1); // bullet will collide with model
	bullet.health = 1000;

	while( bullet.health > 0 )
	{
		// wait for damage...
		bullet waittill("dmg", dmg, who, weap, point, mod);
		bullet.health -= dmg;

		iPrintln("dmg:" + dmg + "; who:" + who.name + "; mod:" + mod);
	}
}

setCanDamage( flag )
{
	if( !isDefined( self.bashradius ) )
		self.bashradius = 32;

	if( !flag )
	{
		self notify("kill_damagemonitor");
		return;
	}
	else
		self thread setCanDamage2();
}


setCanDamage2()
{
	self endon("kill_damagemonitor");

	trace = undefined;

	while( 1 )
	{

		players = getEntArray( "player", "classname" );
		for( i = 0; i < players.size; i++ )
		{
			p = players[i];

			if( !isDefined( p.bash_delay ) )
				p.bash_delay = false;

			forward = vectorscale( anglesToForward(p getPlayerAngles()), 10000 );
			startOrigin = p getEye() + (0,0,20);
			endOrigin = startOrigin + forward;

			trace = bulletTrace( startOrigin, endOrigin, true, p );
			distance = distance ( self.origin, p.origin ) ;

			wait 0.05;

			if( isDefined( trace["entity"] ) && trace["entity"] == self )
			{
				if( p attackButtonPressed() && isWeapon( p getCurrentWeapon() ) && p getWeaponSlotClipAmmo(p getCurrentSlot()) > 0)
				{
					weap = p getCurrentWeapon();
					dmg = getDamage( weap );
					who = p;
					point = trace["position"];
					mod = damageMod( weap );

					self notify("dmg", dmg, who, weap, point, mod);
				}
				if ( p meleeButtonPressed() && !p.bash_delay && distance( p.origin, self.origin ) < self.bashradius )
				{
					p thread bash_delay( 0.6 );
					weap = p getCurrentWeapon();
					dmg = getDamage( weap );
					who = p;
					point = trace["position"];
					mod = "MOD_MELEE";

					self notify("dmg", dmg, who, weap, point, mod);
				}

			}

		}
		wait 0.05;
	}
}

bash_delay( time )
{
	self endon("disconnected");
	self.bash_delay = true;
	wait time;
	self.bash_delay = false;
}

getDamage(weapon)
{
	switch(weapon)
	{
	case "springfield_mp":
		return 50;
	case "enfield_scope_mp":
		return 50;
	case "mosin_nagant_sniper_mp":
		return 50;
	case "kar98k_sniper_mp":
		return 50;
	case "mosin_nagant_mp":
		return 50;
	case "kar98k_mp":
		return 50;
	case "m1carbine_mp":
		return 38;
	case "m1garand_mp":
		return 38;
	case "enfield_mp":
		return 50;
	case "SVT40_mp":
		return 38;
	case "g43_mp":
		return 38;
	case "bar_mp":
		return 40;
	case "bren_mp":
		return 40;
	case "mp44_mp":
		return 40;
	case "thompson_mp":
		return 35;
	case "sten_mp":
		return 33;
	case "greasegun_mp":
		return 34;
	case "mp40_mp":
		return 36;
	case "ppsh_mp":
		return 30;
	case "PPS42_mp":
		return 40;
	case "shotgun_mp":
		return 40;
	case "panzerschreck_mp":
		return 400;
	case "TT30_mp":
		return 20;
	case "webley_mp":
		return 20;
	case "colt_mp":
		return 20;
	case "luger_mp":
		return 20;
	default:
		return 70;
	}
}

damageMod(weapon)
{
	switch(weapon)
	{
	case "springfield_mp":
	case "enfield_scope_mp":
	case "mosin_nagant_sniper_mp":
	case "kar98k_sniper_mp":
	case "mosin_nagant_mp":
	case "kar98k_mp":
	case "enfield_mp":
		return "MOD_RIFLE_BULLET";

	case "m1carbine_mp":
	case "m1garand_mp":
	case "SVT40_mp":
	case "g43_mp":
	case "bar_mp":
	case "bren_mp":
	case "mp44_mp":
	case "thompson_mp":
	case "sten_mp":
	case "greasegun_mp":
	case "mp40_mp":
	case "ppsh_mp":
	case "PPS42_mp":
	case "shotgun_mp":
		return "MOD_RIFLE_BULLET";

	case "TT30_mp":
	case "webley_mp":
	case "colt_mp":
	case "luger_mp":
		return "MOD_PISTOL_BULLET";

	case "panzerschreck_mp":
	case "panzerfaust_mp":
		return"MOD_PROJECTILE";

	default:
		return "MOD_UNKNOWN";
	}
}



also ich nehme jetzt natürlich an das es keine testclients sind, sondern xmodel?!


das ist eine von hier >>LINK<< ( credits: BraX )

was die funktion macht:
-berechnet für jeden spieler die blickrichtung mit bullettrace
-wenn spieler attackbuttonpressed() und er auf ein xmodel sieht 'bemerkt' das xmodel den schaden mit waffe, verursacher etc.

insgesamt geht es einwandfrei, aber da jeder spieler erfasst wird und aller 0.05 sekunden abgefragt wird, ist es schon ne ziemlich große rechenlast für den server... das bei 20+ spielrn, da geht nichts mehr, nur lagg (kann ich mir vorstellen)
earliboy
Erstmal danke für die antwort grosses Grinsen

Also IzNoGod (sollte denk ich ein Name sein), hat schon versucht mir dabei zu helfen und mir das script gegeben.
1. Frage: Wie verweise ich auf den thread? einfach oben zombot thread ...setcandamage?
oder sowas wie setCanDamage = true; ?

dann wäre meine nächste frage, wie mache ich das man sieht das man den Zombie getroffen hat? I-wie ist es möglich, ich habs bereits auf nem anderen Zombot server gesehen.

MFG Earli
serthy
also
es müsste so gehen:

zombie[i] setCanDamage( true );

quasi so:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
monitorDamagel( zombie )
{ 
    zombie setCanDamage(1); // turn damage monitor on
    zombie setContents(1); // bullet will collide with model
    zombie.health = level.zombie["health"] * level.skill; //je höher der skill desto stärker der zombie
 
    while( zombie.health > 0 )
    {
        // wait for damage...
        zombie waittill( "dmg" , dmg , who , weap , point , mod );
        zombie.health -= dmg;
        if( zombie.health <= 0 )
                 zombie notify("delete me");
    }
}



zu der trefferanzeige:

schau mal in den gametypes nach, bei CallBack_PlayerDamage() findest du eine funktion die heißt glaube updateDamageFeedback()
dazu gibt es eine gsc fatei, die dabei aufgerufen wird: _damagefeedback.gsc

(es ist im prinzip nur ein shader der pro treffer für 1 sekunde aufgerufen wird)