Ein neues Thema erstellen  Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1 2 Nächste
Autor Nachricht
 Betreff des Beitrags: PLUGIN_SDAL_BUNNYHOP
BeitragVerfasst: 04.02.2003, 20:25 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
Hi Leute!

Ich habe mir mal was lustiges ausgedacht. (Ich finde es zumindest lustig)

Nach dem es ja admin_bury gibt, dachte ich mir, dass man es ja auch mal in die Luft verlegen kann.

Und so ist das plugin_sdal_bunnyhop entstanden.

Es bringt eben den Spieler dazu, die ganze Zeit duckjumps zu machen.

Befehle:
admin_bunnyall
admin_bunnyall_off
admin_bunny 'Player'
admin_bunny_off 'Player'
admin_bunny_t
admin_bunny_ct

Man kann es ja als Bestrafung benutzen oder eben als reines Fun-Plugin.

Sobald einer der springenden Spieler stirbt, ist er erlöst. Es bringt also nichts, einen toten Spieler in ein Bunny zu verwandeln. Er ist direkt wieder erlöst.

Sagt mir, ob es funktioniert. Hoffe, dass es die Serverlast nicht zu sehr hochtreibt.

Gruß,
SDal

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 04.02.2003, 21:43 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
wenn ich das nicht total verpeilt habe hast du es verpeilt ^^
also ich hätte das anders gelöst. vielleicht komme ich ja noch dazu...


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 04.02.2003, 22:29 
AM.de Team

Registriert: 08.07.2002, 21:11
Beiträge: 2192
Die Idee finde ich allerdings koestlich :lol: :lol: :lol: :lol: :lol: :lol:
muss ich mir ansehen!!

_________________
it's better to burn out, than to fade away


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 04.02.2003, 22:38 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
hier. hat bisher nur admin_bunny, nix mit team oder all, das mach ich wenn ich nochmal zeit habe.
ausserdem ne neue helperfunction, juhu (print_message)
Code:
#include <adminlib>

/* Constants */
#define ACCESS_BUNNY ACCESS_KICK

#define MSG_CONSOLE 1<<0
#define MSG_CENTER 1<<1
#define MSG_CHAT 1<<2
#define MSG_TSAY 1<<3
#define MSG_CSAY 1<<4

/* Global Variables */
new g_Version[] = "0.8";
new g_Bunny[MAX_PLAYERS];
new g_LastRun;
new g_maxplayers;

/* Function Declarations */
forward AdminBunny(HLCommand,HLData,HLUserName,UserIndex);
forward TimerBunny(Timer,Repeat,HLUser,HLParam);

/* Event Handlers */
public plugin_init() {
    plugin_registerinfo("Rinde's Bunnyhopping Plugin","Forces players to duckjump",g_Version);
    plugin_registercmd("admin_bunny","AdminBunny",ACCESS_BUNNY,"Make target jump repeatedly");
    g_maxplayers = min(21,maxplayercount());
    return PLUGIN_CONTINUE;
}

public plugin_connect(HLUserName,HLIP,UserIndex) {
    g_Bunny[UserIndex] = 0;
    return PLUGIN_CONTINUE;
}

public plugin_disconnect(HLUserName,UserIndex) {
    g_Bunny[UserIndex] = 0;
    return PLUGIN_CONTINUE;
}

public TimerBunny(Timer,Repeat,HLUser,HLParam) {
    new Text[MAX_TEXT_LENGTH];
    new Name[MAX_NAME_LENGTH];
    new Dead;
    new counter;
    new i;
    for(i=1;i<=g_maxplayers;i++) {
        if(g_Bunny[i] == 1) {
            if(playerinfo(i,Name,MAX_NAME_LENGTH,_,_,_,Dead) == 1) {
                if(Dead == 0) {
                    execclient(Name,"+jump;wait;+duck;-jump;wait;-duck");
                    g_Bunny[i] = 2;
                    counter++;
                } else {
                    g_Bunny[i] = 0;
                    snprintf(Text,MAX_TEXT_LENGTH,"%s can take breath again for a while.",Name);
                    print_message(Text,0,MSG_CONSOLE|MSG_CSAY);
                    print_message("You can take breath again for a while.",i,MSG_CSAY);
                }
            }
        } else if(g_Bunny[i] == 2) {
            g_Bunny[i] = 1;
            counter++;
        }
    }
    g_LastRun = systemtime();
    if(counter > 0) {
        set_timer("TimerBunny",1,0);
    }
}

/* Command Handlers */
public AdminBunny(HLCommand,HLData,HLUserName,UserIndex) {
    new Data[MAX_DATA_LENGTH];
    new Text[MAX_TEXT_LENGTH];
    new TargetIndex;
    convert_string(HLData,Data,MAX_DATA_LENGTH);
    strstripquotes(Data);
    if(check_user(Data) == 0) {
        selfmessage("Unrecognized player:");
        selfmessage(Data);
    } else {
        get_username(Data,Data,MAX_NAME_LENGTH);
        get_userindex(Data,TargetIndex);
        if(g_Bunny[TargetIndex] != 0) {
            selfmessage("That player already is a bunny");
        } else if(check_immunity(Data) == 1) {
            snprintf(Text,MAX_TEXT_LENGTH,"Fal. You can't transform %s into a bunny.",Data);
            selfmessage(Data);
        } else {
            g_Bunny[TargetIndex] = 1;
            snprintf(Text,MAX_TEXT_LENGTH,"%s is now a bunny. Happy hopping.",Data);
            print_message(Text,0,MSG_CONSOLE|MSG_CSAY);
            print_message("You are now a bunny. Happy hopping.",TargetIndex,MSG_CSAY);
            convert_string(HLUserName,Text,MAX_NAME_LENGTH);
            say_command(Text,"admin_bunny",Data);
            if(g_LastRun + 2 <= systemtime()) {
                set_timer("TimerBunny",1,0);
            }
        }
    }
    return PLUGIN_HANDLED;
}

/* Helper Functions */
print_message(msg[MAX_TEXT_LENGTH],UserIndex = 0,Type = 0) {
    new Name[MAX_NAME_LENGTH];
    new dummy;
    new i,j;
    for(i=0;i<5;i++) {
        dummy = Type & 1<<i;
        if(dummy) {
            dummy &= MSG_TSAY | MSG_CSAY;
            if(dummy) {
                format_lines(msg);
            }
            if(UserIndex == 0) {
                for(j=1;j<=g_maxplayers;j++) {
                    if(playerinfo(i,Name,MAX_NAME_LENGTH) == 1) {
                        messageex(Name,msg,i);
                    }
                }
            } else {
                if(playerinfo(UserIndex,Name,MAX_NAME_LENGTH) == 1) {
                    messageex(Name,msg,i);
                }
            }
        }
    }
}

format_lines(Text[MAX_TEXT_LENGTH],maxlen = MAX_TEXT_LENGTH,linelen = 80) {
    new SayText[MAX_TEXT_LENGTH];
    new textpos;
    new saytextpos;
    new textlen = min(maxlen,strlen(Text));
    new numtoadd;
    new i;
    while(textlen-textpos > linelen) {
        for(i=textpos+79;i>textpos;--i) {
            if(Text[i] == '^n' || Text[i] == ' ' && textpos == numtoadd) {
                numtoadd = i;
            }
        }
        if(numtoadd == textpos) {
            numtoadd = textpos+linelen-1;
        }
        for(i=textpos;i<numtoadd;i++) {
            SayText[saytextpos++] = Text[i];
        }
        SayText[saytextpos++] = '^n';
        if(Text[numtoadd] == ' ' || Text[numtoadd] == '^n') {
            numtoadd++;
        }
        textpos = numtoadd;
    }
    for(i=textpos;i<textlen;i++) {
        SayText[saytextpos++] = Text[i];
    }
    saytextpos = min(saytextpos,maxlen);
    for(i=0;i<saytextpos;i++) {
        Text[i] = SayText[i];
    }
    Text[saytextpos] = '^0';
    return saytextpos;
}


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 09:48 
AM.de Team

Registriert: 08.07.2002, 21:11
Beiträge: 2192
Auf meinem Heimdedi hat alles funktioniert ......... na mal sehn, was der I-Netserver sacht :wink:

_________________
it's better to burn out, than to fade away


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 10:33 
AM.de Team

Registriert: 08.07.2002, 21:11
Beiträge: 2192
Auf unserer Schonarbeit funzt es soweit auch, alle Commands. Die Serverlast werde ich mir heute Abend ansehen ......

_________________
it's better to burn out, than to fade away


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 13:36 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
hm?

Rinde: Hast Du sowas schon geschrieben gehabt?

Was macht denn:
1. Die << in
Code:
#define MSG_CONSOLE 1<<0 
#define MSG_CENTER 1<<1 
#define MSG_CHAT 1<<2 
#define MSG_TSAY 1<<3 
#define MSG_CSAY 1<<4 
2. Das min bei
Code:
g_maxplayers = min(21,maxplayercount()); 
3. Diese Zeile
Code:
dummy &= MSG_TSAY | MSG_CSAY;
4. Wofür brauchst Du
g_LastRun = systemtime();
und den counter.

Ich will ja schließlich noch was lernen :-).

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 17:32 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
Zitat:
hm?

Rinde: Hast Du sowas schon geschrieben gehabt?

Was macht denn:
1. Die << in
Code:
#define MSG_CONSOLE 1<<0 
#define MSG_CENTER 1<<1 
#define MSG_CHAT 1<<2 
#define MSG_TSAY 1<<3 
#define MSG_CSAY 1<<4 
bit-shift
erzeugt im wesentlichen 2er-potenzen, so dass ich die anzeigeart als (bit)summe übergeben kann


2. Das min bei
Code:
g_maxplayers = min(21,maxplayercount()); 
einfach nur ne sicherung. einmal ist under server abgestürzt, weil eine schleife (for 1 <= g_maxplayers) bis n paar milliarden ging

3. Diese Zeile
Code:
dummy &= MSG_TSAY | MSG_CSAY;
dummy wird 0, es sei denn, type enthielt MSG_TSAY oder MSG_CSAY

4. Wofür brauchst Du
g_LastRun = systemtime();
und den counter.

der counter zählt, wieviele noch hüpfen sollen. sind es null, wir der timer nicht neu gestartet
g_LastRun speicher ich, damit es auch funktioniert, falls es beim timer nen error gab, er es aber nicht merkt. wenn die ausführung sich um mehr als 1 sekunde verzögert, startet er den timer neu


Ich will ja schließlich noch was lernen :-).


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 18:57 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
kannst Du mir nochmal das bit-shift erklären?

Ich hatte bei mir übrigens am Anfang einen lustigen Error.

Und zwar mit dem Timer.

Ich versuche mal den Fehler zu erklären.

Ich habe zuerst keinen dummy in der Funktion bunny_all gehabt.
Ich habe einfach "" als zweiten Parameter benutzt, wenn ich im switch Befehl das check_player ausführe.

So.

Durch check_player habe ich den UserIndex und übergebe ihn an bunny_on (oder bunny_off). Dort wird ja der Timer aufgerufen. Als Endless Repeating.

Der erste Aufruf der Timer-Funktion "bunnyhop" hat noch funktioniert, obwohl schon mein diplay_console Schrott angezeigt hat. Die erste Zeile selfmessage("--SDAL-BUNNYHOP--"); wurde nicht mehr angezeigt und durch 'lot' ersetzt. (Ich spiele als Sir Drink a lot auf meinem Server)

Beim zweiten Aufruf des Timer kam ein Error 19, da er nun die Funktion " Drink a lot" oder " r Drink a lot" aufrufen wollte, anstatt der Timer Funktion "bunnyhop".

Was ruft jetzt diesen Fehler hervor?
Rufe ich die Hilfsfunktionen falsch auf?

Irgendwo hakt es in meinem Verständniss.

NACHTRAG:

Ich musste schon einmal feststellen, dass ein Timer auf Veränderungen einer globalen Variable nicht reagiert hat.
Ich habe in meinem Time-Manager auch einen sich selbst aufrufenden Timer.

Am Anfang habe ich auch versucht, durch eine ON/OFF Variable das "sich selber aufrufen" zu stoppen und manchmal hat er darauf nicht reagiert. Keine Ahnung wieso.

Also Timer sind wirklich eine seltsame Sache. Ich habe immer Probleme mit den Dingern. Darum rufe ich für jede Person einen eigenen Timer auf, anstatt es durch einen selbstaufrufenden Timer zu machen.

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Zuletzt geändert von Sir Drink a lot am 05.02.2003, 19:28, insgesamt 1-mal geändert.

Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 19:22 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Ganz einfach. Das ist wie bei einem guten Freund. Der schiebt Dir sicher auch noch ein Bit rüber, wenn Deins leer ist. :lol:

Ich hab auch keine Ahnung davon, habe mich mit Programmiertechnik bisher wenig befasst. ;)

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 20:19 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
najut, kleine lektion in sachen bitoperationen, jedenfalls soviel, wie ich aus dem lesen anderer plugins mitgekriegt habe:

1. << und >>: operatoren für bitshift. schiebt die bits der zahl 1 um zahl 2 stellen nach links bzw. rechts
bsp: 1 = 00000001
1<<4 = 00010000 = 2^4 = 16

2. ~: kehrt bits einer zahl um
bsp: 3 = 00000011
~3 = 11111100

3. &: bitweises und. vergleicht die bits von zahl 1 und zahl 2, der wert des ergebnisses hat die bits gesetzt, die bei beiden zahlen 1 sind
bsp: 2 & 1 = 00000010 & 00000001 = 00000000 = 0
3 & 1 = 00000011 & 00000001 = 00000001 = 1

4. |: bitweises oder: vergleicht die bits von zahl 1und zahl 2, der ergebniswert hat dort eine 1, wo eine der beiden zahlen eine 1 hat
bsp: 1 | 2 = 00000001 | 00000010 = 00000011 = 3
1 | 3 = 3

die operatoren & und | können wie + * / - usw vor dem = einer zuweisung stehen.

var = var & 1
ist dasselbe wie
var &= 1

von den anderen operatoren weiss ich es nicht. die prioritäten kenne ich auch nciht, ich weiss nur, dass & höher als | ist. dazu könnte man aber sicherlich google befragen, wird wohl genauso sein wie bei C(++)


btw: die überprüfung mit dem g_LastRun habe ich auch nur, weil ich timern ebenfalls nicht ganz traue. sollte der timer aus irgendeinem grund ausfallen, kann man ihn 2 sekunden danach neu starten. würde ich für ein und aus eine variable setzen, könnte ich das nicht, er würde ja denken es wäre schon an.

nur wenn man es anschaltet 1 sekunde nachdem der letzte ausgeschaltet hat funzt es halt nicht. nobody is perfect

dieses system hat sich bei einem anderen plugin von mir bereits bewährt, und ich habe für dieses große teile kopiert. das poste ich aber nicht, weil es nen cheat plugin ist. es zeigt die hp aller spieler, auch der gegner an ^^


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 22:22 
AM.de Team

Registriert: 08.07.2002, 21:11
Beiträge: 2192
Auch wenn ich vom mittlerweilen Thema abschweife, bei 10 Spielern gingen auf einem 'geschwaechten' Gamigostrikeserver die Scoreboardpings bei bunnyall um ca. 50 nach oben.

_________________
it's better to burn out, than to fade away


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 22:32 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
sdals methode ist auch ineffizient. er hat für jeden spieler einen timer, und ruft doch bei jedem timer alle spieler auf. oder so ähnlich


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 22:39 
AM.de Team

Registriert: 08.07.2002, 21:11
Beiträge: 2192
Tja ihr Cracks, da empfehle ich nur Synergie !!!! :lol:
Meine Feststellung ist auch nicht gerade Referenz ............... bin halt noch das Quartal an diesen Serveranbieter gebunden ........ (Obwohl ich bei diesem 'Fruehsport' diesen Pinganstieg als nicht so schlimm empfinde :lol:)

hmmm, da faellt mir ein, kennt jemand noch einen guten Linuxanbieter?

_________________
it's better to burn out, than to fade away


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 23:44 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
ok. Ineffizient mit den vielen Timern. Sehe ich ein, da ich ja doch immer eine Schleife über alle Spieler laufen lasse. Ich werde es auch wieder mit der selbstaufrufenden Timerprogrammierung versuchen.

Es hat aber nichts mit der Erhöhung der Serverlast zu tun.

Es ist ja so, dass der Server für 10 Spieler gleichzeitig zwei execclient ausführen muss.
Ist ja klar, dass das was heftig wird.

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 05.02.2003, 23:53 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
nochmal n update zu den operatoren: ich hab mal selber nach der prioritätentabelle gegoogelt (mit beschreibung, w00t!!!11)

Stufe 15
( ) Gruppieren von Ausdrücken
[ ] Auswahl einer Feldkomponente
Stufe 14
! ~ Negation (logisch, bitweise)
++ -- Inkrementieren, Dekrementieren (Präfix oder Postfix)
+ - Vorzeichen (unär)
Stufe 13
* / Multiplikation, Division (binär)
% Rest bei ganzzahliger Division (binär)
Stufe 12
+ - Summe, Differenz (binär)
Stufe 11
<< >> bitweise Verschiebung nach links, rechts
Stufe 10
< <= Vergleich auf kleiner, kleiner oder gleich
> >= Vergleich auf größer, größer oder gleich
Stufe 9
== != Vergleich auf gleich, ungleich
Stufe 8
& Und (bitweise)
Stufe 7
^ exklusives Oder (bitweise)
Stufe 6
| inklusives Oder (bitweise)
Stufe 5
&& Und (logisch)
Stufe 4
|| inklusives Oder (logisch)
Stufe 3
? : bedingte Auswertung (nur paarweise)
Stufe 2
= Wertzuweisung
°= zusammengesetzte Wertzuweisung mit ° für: * / % + - << >> & ^ |




und @ sdal: ich glaub schon, dass timer ziemlich viel performance ziehen in am, wenn man also 10 stück hat, mit nem intervall von 1s, und die dann noch die playerinfo von jedem spieler holen usw.


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 06.02.2003, 02:22 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
ok.ok :-)

Ich verbesser den Code.

Und am Ende sieht er aus wie Deiner :lol:

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 06.02.2003, 10:33 
AM.de Team

Registriert: 04.10.2002, 16:14
Beiträge: 1212
du musst zugeben, dass das nicht so die gute idee ist, da kannste ja auch gleich meinen nehmen ^^


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 06.02.2003, 17:13 
AM.de Team
Benutzeravatar

Registriert: 27.11.2001, 01:00
Beiträge: 3564
Wohnort: In der Nähe von Bonn
mal sehen :-)

_________________
Fehleranalyse: Poste den Inhalt Deiner liblist.gam, (listen)server.cfg, adminmod.cfg, users.ini, vault.ini, plugin.ini von adminmod und plugins.ini von metamod. Benutze auch die Such-Funktion


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 06.02.2003, 19:07 
AM.de Team
Benutzeravatar

Registriert: 23.11.2001, 00:00
Beiträge: 3842
Wohnort: Vor König Arthus
Ich sehe das wie beim lernen. Es lernt sich einfach besser, wenn man es mal selbst versucht. 8)

_________________
Der schwarze Ritter triumphiert immer...
WING-Clan


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1 2 Nächste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de
Original Design von "[ Half-Life Admin Mod © Alfred Reynolds 2000-2003 ] - [ site design by Jägermeister ]"