AdminMod.de
https://www.adminmod.de/

PLUGIN_SDAL_BUNNYHOP
https://www.adminmod.de/viewtopic.php?t=4703
Seite 1 von 2

Autor:  Sir Drink a lot [ 04.02.2003, 20:25 ]
Betreff des Beitrags:  PLUGIN_SDAL_BUNNYHOP

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

Autor:  Rinde [ 04.02.2003, 21:43 ]
Betreff des Beitrags: 

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...

Autor:  [-=THH=-]Stillsetzhut [ 04.02.2003, 22:29 ]
Betreff des Beitrags: 

Die Idee finde ich allerdings koestlich :lol: :lol: :lol: :lol: :lol: :lol:
muss ich mir ansehen!!

Autor:  Rinde [ 04.02.2003, 22:38 ]
Betreff des Beitrags: 

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;
}

Autor:  [-=THH=-]Stillsetzhut [ 05.02.2003, 09:48 ]
Betreff des Beitrags: 

Auf meinem Heimdedi hat alles funktioniert ......... na mal sehn, was der I-Netserver sacht :wink:

Autor:  [-=THH=-]Stillsetzhut [ 05.02.2003, 10:33 ]
Betreff des Beitrags: 

Auf unserer Schonarbeit funzt es soweit auch, alle Commands. Die Serverlast werde ich mir heute Abend ansehen ......

Autor:  Sir Drink a lot [ 05.02.2003, 13:36 ]
Betreff des Beitrags: 

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 :-).

Autor:  Rinde [ 05.02.2003, 17:32 ]
Betreff des Beitrags: 

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 :-).

Autor:  Sir Drink a lot [ 05.02.2003, 18:57 ]
Betreff des Beitrags: 

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.

Autor:  [WING] Black Knight [ 05.02.2003, 19:22 ]
Betreff des Beitrags: 

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. ;)

Autor:  Rinde [ 05.02.2003, 20:19 ]
Betreff des Beitrags: 

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 ^^

Autor:  [-=THH=-]Stillsetzhut [ 05.02.2003, 22:22 ]
Betreff des Beitrags: 

Auch wenn ich vom mittlerweilen Thema abschweife, bei 10 Spielern gingen auf einem 'geschwaechten' Gamigostrikeserver die Scoreboardpings bei bunnyall um ca. 50 nach oben.

Autor:  Rinde [ 05.02.2003, 22:32 ]
Betreff des Beitrags: 

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

Autor:  [-=THH=-]Stillsetzhut [ 05.02.2003, 22:39 ]
Betreff des Beitrags: 

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?

Autor:  Sir Drink a lot [ 05.02.2003, 23:44 ]
Betreff des Beitrags: 

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.

Autor:  Rinde [ 05.02.2003, 23:53 ]
Betreff des Beitrags: 

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.

Autor:  Sir Drink a lot [ 06.02.2003, 02:22 ]
Betreff des Beitrags: 

ok.ok :-)

Ich verbesser den Code.

Und am Ende sieht er aus wie Deiner :lol:

Autor:  Rinde [ 06.02.2003, 10:33 ]
Betreff des Beitrags: 

du musst zugeben, dass das nicht so die gute idee ist, da kannste ja auch gleich meinen nehmen ^^

Autor:  Sir Drink a lot [ 06.02.2003, 17:13 ]
Betreff des Beitrags: 

mal sehen :-)

Autor:  [WING] Black Knight [ 06.02.2003, 19:07 ]
Betreff des Beitrags: 

Ich sehe das wie beim lernen. Es lernt sich einfach besser, wenn man es mal selbst versucht. 8)

Seite 1 von 2 Alle Zeiten sind UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/