Raised This Month: $ Target: $400
 0% 

dégâts d'une seule personne


  
 
 
Thread Tools Display Modes
bboygrun
CHOMP
Join Date: May 2010
Location: France
Old 12-27-2011 , 23:05   Re: dégâts d'une seule personne
#11

PHP Code:
new players32 ], num
get_players
playersnum"h" )

for( new 
0target players]; numtarget players[ ++ ] )
{
    if( 
g_canAttackid ][ target ] )
    {
        
// ...
    
}
    
// Ou avec méthode de Mica
    
if( getCanTaketargetid ) )
    {
        
// ...
    
}

__________________
bboygrun is offline
ConnorMcLeod
Veteran Member
Join Date: Jul 2006
Location: France (95)
Old 12-28-2011 , 01:25   Re: dégâts d'une seule personne
#12

Quote:
Originally Posted by micapat View Post
PHP Code:
new canTakeDamage[33];

getCanTake(%1,%2)        (canTakeDamage[%1] & (1<<%2))
setCanTakeToTrue(%1,%2)  (canTakeDamage[%1] |= (1<<%2))
setCanTakeToFalse(%1,%2) (canTakeDamage[%1] &= ~(1<<%2))

// ...................

setCanTakeToTrue2); // Joueur 5 peut attaquer joueur 2
setCanTakeToTrue214 ); // Joueur 14 peut attaquer joueur 2
setCanTakeToFalse230 ); // Joueur 30 ne peut pas attaquer joueur 2
getCanTake215 ); // Joueur 15 peut-il attaquer joueur 2 ? 
%1 -> joueur victime
%2 -> joueur attaquant

Pas testé, mais un truc du genre suffirait.
Ca va se chier dessus si tu passes l'id 32, donc soit :

Code:
#define getCanTake(%1,%2)		(canTakeDamage[%1] & 1<<(%2-1))
#define setCanTakeToTrue(%1,%2)		canTakeDamage[%1] |= 1<<(%2-1)
#define setCanTakeToFalse(%1,%2)	canTakeDamage[%1] &= ~(1<<(%2-1)
soit (en théorie plus rapide )
Code:
#define getCanTake(%1,%2)		(canTakeDamage[%1] & 1<<(%2&31))
#define setCanTakeToTrue(%1,%2)		canTakeDamage[%1] |= 1<<(%2&31)
#define setCanTakeToFalse(%1,%2)	canTakeDamage[%1] &= ~(1<<(%2&31)
Maintenant si tu veux que seulement A et B puissent s'attaquer, et B et C puissent seulement s'attaquer entre eux, sans que d'autres joueurs puissent les attaquer ou être attaqués par eux, il y'a plus simple, juste une valeur au hasard genre (peut fonctionner aussi avec + de 2 joueurs)
g_valeur[A] = x
g_valeur[B] = x
g_valeur[C] = y
g_valeur[D] = y

Et dans le callback
if( g_valeur[id] != g_valeur[attacker] ) supercede.


Tout dépend en fait de ce que tu veux faire exactement, si les joueurs sont censés chacun appartenir à un "monde" précis, par exemple, la façon que je vient de te donner convient parfaitement.
Si en revanche un joueur a la possibilité d'attaquer 2 groupes de personnes, dans ce cas on revient à la 1ère façon.
Donc le truc c'est de savoir vraiment ce que tu veux pour trouver la meilleur façon, qui pourrait être encore différente de ce qui t'as été donné.
__________________
- tired and retired -

- my plugins -

Last edited by ConnorMcLeod; 12-28-2011 at 01:25.
ConnorMcLeod is offline
Devil259
Veteran Member
Join Date: Dec 2009
Location: France (59)
Old 12-28-2011 , 13:34   Re: dégâts d'une seule personne
#13

En faite, je veux faire des sortes de "duels" entre deux personnes.

Donc j'ai un player menu, avec le nom en gris si la personne est morte/en duel, et le nom en blanc si la personne est "disponible".

Donc, dans le handler de mon menu, je check etc.. si disponible :

Code:
g_CanTakeDmg[ id ][ target ] = true g_CanTakeDmg[ target ][ id ] = true

Donc, pour savoir s'ils sont en duel ou non, j'ai créer un booléen pour chaque joueur
Code:
new bool:isInDuel[ 33 ]

dans Ham_TakeDamage :

Code:
public fw_Ham_TakeDmg( ........ ) {      if( isInDuel[ victim ] )      {           if( !g_CanTakeDmg[ victim ][ attacker ] )           {                return HAM_SUPERCEDE           }           return HAM_IGNORED      }      return HAM_IGNORED }

Mais par exemple, quand le duel est fini (donc quand Ham_Killed est appelé, ou bien Ham_Spawn), comment faire pour régler g_CanTakeDmg sur false pour les deux ?
__________________
You can do anything you set your mind to, man.


Last edited by Devil259; 12-28-2011 at 13:35.
Devil259 is offline
bboygrun
CHOMP
Join Date: May 2010
Location: France
Old 12-28-2011 , 13:49   Re: dégâts d'une seule personne
#14

PHP Code:
public fw_Ham_TakeDmg( ........ )
{
     if( 
isInDuelvictim ] )
     {
          if( !
g_CanTakeDmgvictim ][ attacker ] )
          {
               return 
HAM_SUPERCEDE
          
}

          return 
HAM_IGNORED
     
}

     return 
HAM_IGNORED

Inutile ton "return HAM_IGNORED" dans la condition.

Et bien le isInDuel tu ne le mets pas en boolean, mais tu fais que c'est une variable dans laquelle tu mets l'index de la personne que tu peux attaquer, ( quand isInDuel aura l'index du joueur, ce sera supérieur à 0 donc c'est comme si c'était une boolean sur true ) et ensuite tu pourras faire dans hamKilled

g_CanTakeDmg[ id ][ isInDuel[ id ] ] = false
g_CanTakeDmg[ isInDuel[ id ] ][ id ] = false

Mais la méthode que Mica a donné est meilleure que la mienne avec les variables à plusieurs dimensions ( C'est le bon mot je crois :d ).

EDIT : Si tu veux vraiment bloquer les dommages qu'on te fait, remplace ton Ham_TakeDamage par TraceAttack, car là le joueur recevra aucun dommage mais son viseur bougera si tu lui tires dans la tête etc, tandis que si tu lances un SUPERCEDE dans TraceAttack, les dommages reçus seront bloqués, et le joueur ne sera pas gêné quand on va lui tirer dessus.
__________________

Last edited by bboygrun; 12-28-2011 at 14:06.
bboygrun is offline
Devil259
Veteran Member
Join Date: Dec 2009
Location: France (59)
Old 12-28-2011 , 14:25   Re: dégâts d'une seule personne
#15

g_CanTakeDmg[ id ][ isInDuel[ id ] ] = false

ça a du sens ça ?

Sinon comment je dois faire pour mettre g_CanTakeDmg sur true dans le handler alors ? Parce que là ça devient vraiment... étrange.
__________________
You can do anything you set your mind to, man.

Devil259 is offline
bboygrun
CHOMP
Join Date: May 2010
Location: France
Old 12-28-2011 , 14:33   Re: dégâts d'une seule personne
#16

Attends, tu fais des duels 1v1, que des 1v1 et c'est tout ?

Car si tu fais que des 1v1, inutile de créer une variable à deux dimensions.
__________________
bboygrun is offline
Kidev
Veteran Member
Join Date: Jun 2010
Location: France
Old 12-29-2011 , 02:28   Re: dégâts d'une seule personne
#17

Moi j'avais fait un plugin CS pour une vieille mais très grosse team de CZ, j'avais fait:

new gDuelArg[ 33 ];

Au putinserver:
gDuelArg[ id ] = 0

Quand on lance un duel:
gDuelArg[ id1 ] = id2
gDuelArg[ id2 ] = id1

Dans Takedamage, si gDuelArg[ attacker ] != victim -> SUPERCEDE.

À la fin du duel:
gDuelArg[ id1 ] = 0
gDuelArg[ id2 ] = 0

Enfin, je sais qu'un mec est dans un duel si gDuelArg[ id ] > 0.

Voilà, très simple à utiliser, et marche très bien
__________________

Last edited by Kidev; 12-29-2011 at 02:31.
Kidev is offline
Devil259
Veteran Member
Join Date: Dec 2009
Location: France (59)
Old 12-29-2011 , 08:07   Re: dégâts d'une seule personne
#18

Ouais, bboygrun m'a donné cette méthode sur Steam. J'allais testé, et la donner ici si ça fonctionnait.

Merci à tous.
__________________
You can do anything you set your mind to, man.

Devil259 is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 20:17.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode