AdminMod.de https://www.adminmod.de/ |
|
Der "Ich habe ein Scripting-Problem"-Thread https://www.adminmod.de/viewtopic.php?t=4561 |
Seite 3 von 5 |
Autor: | Rinde [ 09.01.2003, 21:12 ] |
Betreff des Beitrags: | |
Zitat: Vielleicht sollte man doch mal die "anstößigen" Quellcodezeilen hier posten, damit man genau weiss, was gemeint ist und was nicht. in meinem 1. post zum problem
Zitat: Warum sollte das nicht gehen?
weil der compiler dann sagt:WARNING: possibly unintended bitwise operation, siehe 1. post Zitat: Du hättest ja mal BlackKnight den Tip geben können, dass Du die ausgewählten Maps als Bitmaske abspeicherst
ich war eigentlich davon ausgegangen, dass er das verstanden hatte
Zitat: Stattdessen willst Du eine Warnung des Compilers wegbekommen, die doch eigentlich genau das beschreibt, was Du auch bezweckst. nein tut sie nicht. denn die bitwise operation war ganz und gar nicht unintended. und wieso stattdessen? die warnings wegzukriegen war der einzige grund weshalb ich das ganze gepostet habe. denn funktionieren tat es von anfang an
Zitat: So sieht es für mich aus, als ob Du selbst nicht so genau weisst, was Du da eigentlich programmiert hast... da es prinzipiell funktioniert, glaube ich schon, dass ich weiss, was ich getan habe. nur, dass der compiler da anderer meinung war.
|
Autor: | [WING] Black Knight [ 09.01.2003, 22:12 ] |
Betreff des Beitrags: | |
Die Warning kann man dann wohl wirklich ignorieren. Der Compiler meint, dass Du eine "bitwise operation" machen wolltest, dies aber in einer if-Schleife ungewöhnlich ist. Und siehe da, in die Falle bin ich ja auch getreten. Ich dachte ja auch, dass Du "&&" meintest. Ich habe mir den Restcode nicht angesehen. Und vom Compiler darfst Du nicht erwarten, dass er mehr Verständnis für den Code mitbringt als ich. Mit Bitoperationen habe ich mich bisher nicht beschäftigt. Er hat es richtig interpretiert, will Dich aber warnen, dass Du evtl. was anderes vorhattest. Ergo, führe die Aktion komplett vorher aus und schreibe das Ergebnis in eine Variable. Anschließend vergleichst Du die Variable. Versuch mal: Code: new g_sMaps; Code: g_sMaps=g_SelectedMaps[UserIndex] & (1<<i); if(g_sMaps) {Das ergibt beim Compile keine Warning mehr und sollte auch Deiner Funktion genüge tragen. Hoffentlich haben wir das Problem jetzt vom Tisch. |
Autor: | Sir Drink a lot [ 09.01.2003, 22:27 ] |
Betreff des Beitrags: | |
Aber Fazit von der ganzen Diskussion: Eine Warnung ist nur eine Warnung/ Hinweis. Warum dann den Hinweis wegbekommen, wenn man doch genau eine "Bitweise" Operation durchführen will und der Compilier eben denkt, das sie nicht beabsichtigt ist.(da sie bisher wahrscheinlich sehr sehr selten in small angewandt wurde) Ok. Einziger Grund wäre, sich die Diskussionen im Anschluss zu ersparen, die dann die User an einen herantragen, da sie beim Compilieren "Warnings" erhalten. Nun denn...just my two cents.. |
Autor: | [WING] Black Knight [ 09.01.2003, 22:49 ] |
Betreff des Beitrags: | |
Genau das ist der Grund für die Diskussion. Was nicht sein muss, kann auch vermieden werden. |
Autor: | Sir Drink a lot [ 09.01.2003, 23:52 ] |
Betreff des Beitrags: | |
Wie? Was nicht sein muss? Es ist doch gewollt...Das Bitweise Gedöhns ist gewollt. Also. Warum sich ein Bein ausbrechen, nur damit der Compiler es auch ohne Warning akzeptiert und der User nachher keine Fragen stellt.... Wenns klappt, dann klappt es. Ja, ich weiß. Ich denke da was anders als Du |
Autor: | Warhead [ 10.01.2003, 01:19 ] |
Betreff des Beitrags: | |
Zitat: Zitat: Warum sollte das nicht gehen?
weil der compiler dann sagt:WARNING: possibly unintended bitwise operation, siehe 1. post Da ich ein Mensch bin, weiss ich, dass der Code Code: if(i & j == 6) { ... } else { ... }fehlerfrei ist und funktioniert! Warum sollte er auch nicht? |
Autor: | Rinde [ 10.01.2003, 01:27 ] |
Betreff des Beitrags: | |
ich wusste das auch. hätte ich es nicht gewusst, hätte ich niemanden mit meinem problem belästigt. und das problem lag darin, dass der compiler OBWOHL es richtig ist ein warning ausspuckt. natürlich weiss ich, wass man warnings ignorieren kann. aber das will ich nicht. |
Autor: | Warhead [ 10.01.2003, 01:33 ] |
Betreff des Beitrags: | |
Also wenn ich diese Warnung bekommen hätte, hätte ich mal kurz im Code nachgeschaut und gesagt: "Jaja Du vorlaute Maschine, immer alles besser wissen wollen, wer hat Dir eigentlich nur soviel künstliche Dummheit eingehaucht?" ... und die Warnung ad acta gelegt... |
Autor: | Sir Drink a lot [ 10.01.2003, 07:49 ] |
Betreff des Beitrags: | |
jep. Zustimmung. Genau der Meinung bin ich auch. Deswegen habe ich auch geschrieben, dass der Compiler die Warnung ausgibt, da in Small eine Bitweise Operation wahrscheinlich sehr selten vorkommt und daher der Programmierer des Compilers sich gedacht hat, dass es besser wäre, eine Warnung mal auszusprechen. Nun denn. Es ist ja trotz allem auch eine Lösung gefunden worden, eine Bitweise Operation durchzuführen, ohne das der Compiler eine Warnung ausgibt. Also hat der Thread sein Ziel erfüllt. *Und ich musste mal wieder feststellen, dass mir eine Menge Grundlagen zur Programmierung fehlen....Gott sei Dank muss ich in meinen Plugins nicht so tief ins Eingemachte gehen* |
Autor: | [WING] Black Knight [ 10.01.2003, 09:45 ] |
Betreff des Beitrags: | |
Jungs, das war mal eine richtige schicke konstruktive Diskussion. Und ich glaube wir haben alle was dazugelernt. Was mich betrifft auf jeden Fall. |
Autor: | Rinde [ 07.02.2003, 23:55 ] |
Betreff des Beitrags: | |
mir fällt grade auf dass das plugin noch gar nicht in der link-list steht. also hier nochmal ne aktuelle version (von heute ) bitte nachfolgenden post beachten |
Autor: | Rinde [ 08.02.2003, 00:06 ] |
Betreff des Beitrags: | |
das plugin_rindy_menubase muss in der plugin.ini UNTER plugin_rm_rindy_player stehen. Beschreibung: Ersetzt admin_kick und admin_ban. Fügt ein neues command admin_warn hinzu. alle commands können mit grund (jeweils letzter parameter) benutzt werden. die gründe werden in die dateien warnreasons.log, kickreasons.log und banreasons.log im addons/adminmod verseichnis eingetragen. dabei versucht das plugin, den ungefakten nick des admins zu ermitteln, indem es seine wonid und sein adminmod-passwort mit einträgen in einer datei, der addons/adminmod/config/nicks.txt, vergleicht. diese muss im format 'wonid passwort name' z.b. 12345 meinpasswort Name kann Leerzeichen enthalten spieler die in dieser datei aufgelistet sind, haben gleichzeitig immunität gegen diese 3 commands. als weiteres feature merkt sich das plugin die daten der letzten spieler, die den server verlassen haben (im plugin einstellbar, default 5), so dass diese gebannt werden können, wenn sie den server schon verlassen haben. um die administration des ganzen zu erleichtern, habe ich noch ein kleines menü eingebaut. admin_playermenu listet alle spieler auf. wählt man einen aus, erhält man die wahl zwischen warn, kick und ban, sowie 9 gründe und 6 banzeiten zur auswahl, die man durchschalten kann. verwarnte spieler haben im menü ein rotes '#' vor dem nick, gekickte ein '*!*' und admins ein gelbes '@'. weiterhin werden alle admins (admins sind in diesem fall alle, die in der nicks.txt stehen) über warns, kicks und bans informiert, sowie wenn ein kurzfristig gekickter spieler unter anderem namen zurückkehrt. |
Autor: | Sir Drink a lot [ 08.02.2003, 14:29 ] |
Betreff des Beitrags: | |
Hi! @Rinde: Kannst es doch in die Plugin-Link-Liste setzen. Da darfst Du mal meinen Beitrag editieren. Hab im Moment keine Zeit! Gruß, SDal |
Autor: | Rinde [ 08.02.2003, 16:17 ] |
Betreff des Beitrags: | |
done |
Autor: | Sir Drink a lot [ 08.02.2003, 16:44 ] |
Betreff des Beitrags: | |
kk. Aber Du hast vergessen, das Datum im Titel zu ändern. Done. |
Autor: | Rinde [ 17.02.2003, 23:57 ] |
Betreff des Beitrags: | |
es ist mal wieder soweit. ich habe einen fehler, dessen herkunft mit ein absolutes rätsel ist Code: public plugin_init() { ... plugin_registercmd("admin_unfake","UnFake",ACCESS_UNFAKE,"admin_unfake: Prints name(s) of all faked players."); plugin_registercmd("specmode","Connect",ACCESS_ALL); //function called on connect return PLUGIN_CONTINUE; } public Connect(HLCommand,HLData,HLUserName,UserIndex) { ... g_Admin[UserIndex] = isadmin(UserIndex); ... return PLUGIN_CONTINUE; } public UnFake(HLCommand,HLData,HLUserName,UserIndex) { new Menutext[512]; new LineData[MAX_DATA_LENGTH]; new Name[MAX_NAME_LENGTH]; new UserName[MAX_NAME_LENGTH]; new Pass[MAX_NAME_LENGTH]; new players[MAX_PLAYERS]; new num_faked; new pos; new i,j; if(!UserIndex) { selfmessage("This command cannot be used from console."); return PLUGIN_HANDLED; } for(i=1;i<=g_Maxplayers;i++) { if(g_Lines[i][j] && i != UserIndex) { if(playerinfo(i,UserName,MAX_NAME_LENGTH)) { j = 0; pos = 0; if(!strncmp(UserName,"[FN]",4)) { pos = (UserName[4] == ' ') ? 5 : 4; } do { readfile(g_Nicksfile,LineData,g_Lines[i][j++],MAX_DATA_LENGTH); players[num_faked] = 0; if(strgsplit(LineData," ","^"","",0,Pass,MAX_NAME_LENGTH,Name,MAX_NAME_LENGTH) == 3) { if(strcmp(Name,UserName[pos]) == 0) break; } else if(strcmp(Pass,UserName[pos]) == 0) break; players[num_faked] = i; if(j == MAX_NICKS) break; } while(g_Lines[i][j]); if(players[num_faked]) num_faked++; } } } if(!num_faked) { convert_string(HLUserName,UserName,MAX_NAME_LENGTH); kill_menu(UserIndex); menu(UserName,"^n^n^n^n^n^n\yCouldn't find faked players.",1023,0); return PLUGIN_HANDLED; } strcpy(Menutext,"\yFaked players:",512); for(i=0;i<num_faked;i++) { strcat(Menutext,"^n\r",512); playerinfo(players[i],UserName,MAX_NAME_LENGTH); strcat(Menutext,UserName,512); strcat(Menutext,"\w",512); j = 0; while(g_Lines[players[i]][j]) { strcat(Menutext,"^n ",512); readfile(g_Nicksfile,LineData,g_Lines[players[i]][j],MAX_DATA_LENGTH); j++; if(strgsplit(LineData," ","^"","",0,Pass,MAX_NAME_LENGTH,Name,MAX_NAME_LENGTH) == 3) { strcat(Menutext,Name,512); } else { strcat(Menutext,Pass,512); } } } snprintf(UserName,MAX_NAME_LENGTH,"^n^n\y%i players",num_faked); strcat(Menutext,UserName,512); convert_string(HLUserName,UserName,MAX_NAME_LENGTH); kill_menu(UserIndex); menu(UserName,Menutext,1023,0); snprintf(Menutext,512,"(Admin) %s used command admin_unfake",UserName); for(i=1;i<g_Maxplayers;i++) { if(i != UserIndex && playerinfo(i,Name,MAX_NAME_LENGTH) && access(ACCESS_UNFAKE,Name)) { messageex(Name,Menutext,print_chat); } } return PLUGIN_HANDLED; } isadmin(UserIndex) { new LineData[MAX_DATA_LENGTH]; new AuthID[MAX_AUTHID_LENGTH]; new Line; new i; new result; while(readfile(g_Nicksfile,LineData,++Line,MAX_DATA_LENGTH) == 1) { if(!LineData[0] || LineData[0] == '#') continue; strgsplit(LineData," ","^"",AuthID,MAX_AUTHID_LENGTH); if(strcmp(AuthID,g_AuthID[UserIndex]) == 0) { g_Lines[UserIndex][i] = Line; i++; if(i == MAX_NICKS) break; } } result = i ? (auth("") ? 2 : 1) : 0; while(i < MAX_NICKS) { g_Lines[UserIndex][i] = 0; i++; } return result; }es geht um die menüausgabe der unfake-funktion an den letzten eintrag der liste, egal wieviele gefakte personen auf dem server sind, wird die wonid dieses spielers ohne das erste zeichen angehängt, nicht aber "^n^nxx players", dieser erschein gar nicht. nochmal zur verdeutlichung. wenn ich auf dem server fake, und ein andere admin benutzt das command, sieht er folgendes \yFaked players: \rMeinfakenick \wRinde52676 meine wonid ist 452676 frage: wieso wird statt des "^n^n\y%i players",num_faked meine wonid angehägt? und dann ohne das erste zeichen? |
Autor: | [WING] Black Knight [ 18.02.2003, 09:34 ] |
Betreff des Beitrags: | |
Erst einmal würde ich zur Sicherheit Code: new num_faked;in Code: new num_faked=0;umschreiben. Trotzdem seltsam... Was passiert, wenn Du ohne Farben arbeitest? Schon mal %d statt %i versucht? Irgendwie sehe ich den Fehler auch nicht. |
Autor: | Rinde [ 18.02.2003, 17:31 ] |
Betreff des Beitrags: | |
ich glaube man draf strgsplit(LineData," ","^"","",0,...); nicht mit einem leeren 1. parameter aufrufen, möglich? |
Autor: | Sir Drink a lot [ 18.02.2003, 20:00 ] |
Betreff des Beitrags: | |
zu leeren Parameterübergabe ("") habe ich schon die dubiosesten Fehler bekommen. In irgendeinem Thread habe ich es beschrieben. In einem Timer "abc" ein Case eingebaut, der mir entsprechend eine Hilfsfunktion mit 2 Parametern aufruft. Der zweite Parameter war leer und wollte ihn mit "" übergeben. Der Timer "abc" war endless repeated. Irgendwann wollte er eine Timerfunktion "xyz" anstatt 'abc' aufrufen und ausführen. Den gab es aber nicht. Konnte das ganze umgehen, in dem ich einen Dummy[MAX_XYZ] eingesetzt habe und diesen übergab. |
Autor: | [WING] Black Knight [ 18.02.2003, 22:57 ] |
Betreff des Beitrags: | |
Und ich hab mich gestern schon gefragt, warum diese dummy Variable im CW-Creator im Vote-Befehl vorkam. Na gut, dann lass ich das so. |
Seite 3 von 5 | Alle Zeiten sind UTC+01:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |