Modification de plugin b3...

Tout ce qui concerne la configuration et l'administration des serveurs.
Rendez-vous dans Outils de communication & communautaires pour la conception de sites Internet.
Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Modification de plugin b3...

Message par Beber888 » 03 nov. 2009, 02:00

Bonsoir, j'ai enfin réussi à faire un petit quelque chose avec Python sur B3 !
J'ai modifié 2 plugins :
- slap un joueur lorsqu'il se fait warner.
- Affiche le ratio du joueur au respawn du joueur (en pm évidemment).

Je recherche l'event qui dis qu'un joueur respawn, si ça existe pas je prendrai l'event de quand il meurs...

Apres j'ajouterais ptet une commande pour remettre/enlever l'affichage du ratio !!
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Courgette
Messages : 850
Enregistré le : 22 déc. 2007, 02:05
Localisation : Rennes

Re: Modification de plugin b3...

Message par Courgette » 03 nov. 2009, 10:17

Y'a pas d'event pour le respawn, tu dois te contenter du kill.
Si tu veux approfondir, les events de B3 sont générés sur la lecture d'une nouvelle ligne dans le log de UrT. Comme il n'y a rien dans ce log qui indique le respawn...

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 04 nov. 2009, 00:33

Bon en fait j'ai créer un plugins pour gerer l'affichage du ratio au respawn (c'est plus propre).
Tout marche sauf que j'arrive pas récupérer les valeur de kill death et tk sur un joueur (afin de calculer le ratio). En effet ces valeurs sont gérés par le plugins stats mais ne sont pas stokées dans la base de donnée, je ne sais comment lire ces valeurs et faire les declarations qui faut pour les avoir (ya ptet un rapport avec le client.py ?)

Voici mon code qui marche pas :
def SpawnStats(self, client):
"""\
[<name>] - list a players stats for the map
"""
sclient = client
tues = sclient.var(self, 'kills', 0).value
morts = sclient.var(self, 'deaths', 0).value
tk = sclient.var(self, 'teamKills', 0).value
#client.message('affichage points')
#client.message(points)
if morts > 0:
ratio = (tues - tk)/morts
messageratio = '^4--- ^1Ratio : ^4--- ^7%s' % ratio
client.message(messageratio)

Le pb est pour l'affectation des variables tues, morts et tk

Merci de votre aide
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Courgette
Messages : 850
Enregistré le : 22 déc. 2007, 02:05
Localisation : Rennes

Re: Modification de plugin b3...

Message par Courgette » 04 nov. 2009, 00:54

dans onLoadConfig, ajoute

Code : Tout sélectionner

self._statsPlugin = self.console.getPlugin('stats')
pour pouvoir récupérer les infos du plugin stats.

puis quand tu veux afficher les infos au respawn, utilise quelque chose du genre :

Code : Tout sélectionner

                if self._statsPlugin:
                    maxratio = None
                    maxskill = None
                    for c in self.console.clients.getList():
                        
                        kills = c.var(self._statsPlugin, 'kills', 0).value
                        deaths = c.var(self._statsPlugin, 'deaths', 0).value
                        if deaths != 0:
                            ratio = float(kills) / deaths
                            if maxratio is None or maxratio < ratio:
                                maxratio = ratio
                        
                        skill = c.var(self._statsPlugin, 'points', self._statsPlugin._startPoints).value
                        if maxskill is None or maxskill < skill:
                            maxskill = skill
                    
                    if maxskill:
                        maxskill = "%d"%round(maxskill,2)
                    else:
                        maxskill = "?"
                        
                    if maxratio:
                        maxratio = "%1.02f"%round(maxratio,2)
                    else:
                        maxratio = "?"
                        
                        
                        
                    kills = victim.var(self._statsPlugin, 'kills', 0).value
                    deaths = victim.var(self._statsPlugin, 'deaths', 0).value
                    if deaths != 0:
                        ratio = "%1.02f" % round((float(kills) / deaths),2)
                    else:
                        ratio = "?"
                    skill = "%d"%round(victim.var(self._statsPlugin, 'points', self._statsPlugin._startPoints).value, 2)
                    message = '^7ratio ^2%s[%s] ^7Skill ^3%s[%s]' % (ratio, maxratio, skill, maxskill)
                else:
                    hss = self.get_headshots_stats(victim)
                    message = '^7K: ^1%s ^4| ^7HS: ^1%s' % (hss.kills, hss.headshots)
                self.debug(message)
                victim.message(message)

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 04 nov. 2009, 01:03

Merci beaucoup de ton aide !!!
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 10 nov. 2009, 13:04

Est ce qu'il est possible que le bot ne parle qu'a une seule équipe ? (blue ou red)? Si oui comment?
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Courgette
Messages : 850
Enregistré le : 22 déc. 2007, 02:05
Localisation : Rennes

Re: Modification de plugin b3...

Message par Courgette » 10 nov. 2009, 13:17

Il n'y a rien de prévu pour cela, mais c'est pas con comme idée (un peu gourmand en nombre de commande rcon par contre)

Si tu tiens à le faire :
* obtient la liste de tous les joueurs
* pour chaque joueur, si il est de l'équipe machin, alors envoie lui un PM

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 10 nov. 2009, 17:48

Encore une question, (en même temps j'apprend le python).
J'ai besoin de compter le temps entre deux évènements (en secondes).
Pour l'instant je fait un truc comme ça :
If event.type == 'machin1':
Temps1 = event.time
elif event.type == 'machin2':
Temps2 = event.time
Temps3 = temps2 - temps1
Console.write(temps3)

Ca marche? ou vaux mieux faire comme dans le plugin welcome? :
t = threading.Timer(self._welcomeDelay, self.welcome, (event.client,))
t.start()
Quel sont les variables qu'on peu mettre sur timer???
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 10 nov. 2009, 17:55

je crois que j'ai trouve je fait:
temps1 = time.time()
temps2 = time.time()
temps3 = temps2 - temps1
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 11 nov. 2009, 01:15

Bon j ai encore un probleme, je voulais faire un plugin qui compte les flags par joueur et par team, avec un compteur de temps entre le flag pris et le flag capture. Avec une annulation du compteur de temps si le flag est repris.
Le probleme j'ai fouine dans les event et le parser c'est que j'ai que 4 evenements possible et donc le plugin s'enmelle les pinceaux entre les blueflag et redflag.

Les 4 evenements sont :
team_CTF_redflag (action sur redflag : reste tres vagues)
flag_returned (c'est bien mais on sais pas lequel)
flag_dropped (c'est bien mais on sais pas lequel)
flag_captured (c'est bien mais on sais pas lequel)

C'est dommage il me manque des infos qui sont dans les log du serv mais qui sont pas retranscries par le parser.
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Courgette
Messages : 850
Enregistré le : 22 déc. 2007, 02:05
Localisation : Rennes

Re: Modification de plugin b3...

Message par Courgette » 11 nov. 2009, 04:23

les 3 actions concernant les flags (flag_dropped, flag_returned et flag_captured) contiennent aussi des infos sur le joueur en question, donc son équipe et par conséquent, tu peux facilement déduire de quel flag il sagit.

cherche dans b3.log "OnAction"

Dans ton code, écoute les évènement de type b3.events.EVT_CLIENT_ACTION

Code : Tout sélectionner

self.registerEvent(b3.events.EVT_CLIENT_ACTION)
puis dans la méthode "onEvent" :

Code : Tout sélectionner

elif (event.type == b3.events.EVT_CLIENT_ACTION):
            self.debug("client: %s, data: %s" % (event.client.name, event.data))

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 11 nov. 2009, 12:19

Oui mais par exemple sur l event "flag returned", s'il reviens tout seul, ya pas d'info de joueur donc on sais pas lequel c'est.
Du coup je regarde le parser :
def OnFlag(self, action, data, match=None):
#Flag: 1 2: team_CTF_blueflag
#Flag: <_cid> <_subtype:0/1/2>: <text>

_cid = match.group('cid')
_subtype = int(match.group('name'))
data = match.group('text')

if _subtype == 0:
_actiontype = 'flag_dropped'
elif _subtype == 1:
_actiontype = 'flag_returned'
elif _subtype == 2:
_actiontype = 'flag_captured'
else:
return None
return self.OnAction(_cid, _actiontype, data)

Donc on envoie a OnAction (l'id, le type et des données)

Et dans OnAction:
def OnAction(self, cid, actiontype, data, match=None):
#Need example
client = self.clients.getByCID(cid)
if not client:
self.debug('No client found')
return None
self.verbose('OnAction: %s: %s %s' % (client.name, actiontype, data) )
return b3.events.Event(b3.events.EVT_CLIENT_ACTION, actiontype, client)
Et dans l'envent.EVT_CLIENT_ACTION, on n'envoie que actiontype et client, hors les data sont importantes et on les perts. Comment faire pour les récupérer sans modifier le parser?
Genre comment dans mon plugin je recupére les données qui sont envoyées à OnFlag ? Après si j'ai ça jme démerderai...
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Courgette
Messages : 850
Enregistré le : 22 déc. 2007, 02:05
Localisation : Rennes

Re: Modification de plugin b3...

Message par Courgette » 11 nov. 2009, 14:38

Je ne vois pas en quoi le data est nécessaire.

Si tu es bleu, tu ne peux que :
* drop flag red
* return flag blue
* capture flag red

Si tu es red, tu ne peux que :
* drop flag blue
* return flag red
* capture flag blue

Avatar du membre
Beber888
Référent outil (B3)
Messages : 293
Enregistré le : 01 mars 2009, 23:16
Localisation : Plailly(60)

Re: Modification de plugin b3...

Message par Beber888 » 11 nov. 2009, 15:31

C'est vrai mais j'ai peur que d'un seul cas :
Les flag son retourne tout seul (returntime)
Dans ce cas ils n'y a pas d'info ni sur le joueur ni sur la team ni sur le flag.
Et si les deux flags return tout seul, je sais pas qui est qui
Mon serveur FTP
ftp://beber888.myftp.org
Mon serveur UrT
/connect beber888.no-ip.org
Mon site web
http://beber888.no-ip.org/

Avatar du membre
Courgette
Messages : 850
Enregistré le : 22 déc. 2007, 02:05
Localisation : Rennes

Re: Modification de plugin b3...

Message par Courgette » 11 nov. 2009, 16:11

en fait quand le flag return à cause du temps ce n'est pas détecté par le bot du tout (pour l'instant)

Répondre