/** * YMessage Announcer System * * By Alex "Y_Less" Cole * v 0.5 - (c) 2007 * * To use: * * Paste this script into PAWNO (found in "/samp/pawno" if you have * a server) and save. Then close and re-open pawno and this file (there is * a bug with new files apparently, I don't know but better to be safe than * sorry). Then press F5 and copy the .amx from the directory you saved the * .pwn in to your "samp/filterscripts" directory. Then make sure you have a * folder called "scriptfiles" at the same level as "gamemodes" and * "filterscripts". You will need a file called "Y_Messages.txt", the format * of which is as follows: { } { } { } * * Example: * 2 60000 FF00FFFF { Woo, this is a message } { And this is a multi-line message } * * Just do that and you should be away * * Now optimised for 0.2 */ #include #if !defined INVAILD_PLAYER_ID #define INVALID_PLAYER_ID 255 // Fix for other peoples bad code apparently #endif #define DELAY_TIME 30 // Now in seconds #define FILE_NAME "Y_Messages.txt" #define COLOR 0x00FF00FF #define MAX_LINES 10 #define COLOR_MSG 0x0000FFFF #define COLOR_ANNOUNCE 0x00FF00FF #define COLOR_WARN 0xFF0000FF #define HELP(%1) SendClientMessage(playerid, COLOR_MSG, %1); #define MSG(%1) SendClientMessage(playerid, COLOR_ANNOUNCE, %1); #define WARN(%1) SendClientMessage(playerid, COLOR_WARN, %1); new gDelay = DELAY_TIME; //new gLastUpdate = -1; new gColor = COLOR; new record = INVALID_PLAYER_ID; new recording[MAX_LINES][128]; forward ShowMsg(); public OnFilterScriptInit() { // Do my usual fancy stuff here print("\r\n===================================="); print("| |"); print("| YMessage Announcer System |"); print("| ------------------------- |"); print("| |"); print("| By Alex \"Y_Less\" Cole - (c) 2006 |"); print("| v0.3 |"); print("====================================\r\n"); ShowRandomMessage(false); SetTimer("ShowMsg", gDelay, 0); return 0; } public ShowMsg() { ShowRandomMessage(); SetTimer("ShowMsg", gDelay, 0); } hexstr(string[]) { new ret = 0; for (new i = 0, j = 28; i < 8; i++, j -= 4) { new k = string[i]; if (k >= '0' && k <= '9') { ret += (k - 0x30) << j; } else if (k >= 'A' && k <= 'F') { ret += (k - 0x37) << j; } else if (k >= 'a' && k <= 'f') { ret += (k - 0x57) << j; } else { return 0; } } return ret; } ReadMessage(message, File:fileh, playerid) { new count = 0, ok = 0; new string[256]; //printf("hi %d", message); while (fread(fileh, string)) { //printf("%s %d", string, count); if (string[0] == '}') { //print("hi"); if (ok) { break; } else { count++; } } else if (string[0] == '{' && count == message) { //print("end"); ok = 1; } else if (ok) { if (playerid == INVALID_PLAYER_ID) { SendClientMessageToAll(gColor, string); } else { SendClientMessage(playerid, gColor, string); } } } } ShowRandomMessage(a = true, b = -1) { new text[512]; new num, index; new File:yfile; //print("go"); if (fexist(FILE_NAME)) { if ((yfile = fopen(FILE_NAME, io_read))) { fread(yfile, text); num = strval(strtok(text, index)); if (a) { fread(yfile, text); num = (b == -1) ? random(num) : b; ReadMessage(num, yfile, INVALID_PLAYER_ID); } else { gDelay = strval(strtok(text, index)); //printf("%d", gDelay); fread(yfile, text); if (strlen(text) == 10) { if (!(gColor = hexstr(text))) gColor = COLOR; } } fclose(yfile); } else { print("yAd Error: Could not open file"); } } else { print("yAd Error: Messages file not found"); } } strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[32]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof (result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; } public OnPlayerDisconnect(playerid) { if (record == playerid) { record = INVALID_PLAYER_ID; for (new i = 0; i < MAX_LINES; i++) { recording[i][0] = 0; } } return 0; } public OnPlayerText(playerid, text[]) { new retval = 1; if (playerid == record) { new i; for (i = 0; i < MAX_LINES; i++) { if (recording[i][0] == 0) { strmid(recording[i], text, 0, strlen (text)); MSG("Line recorded") //MSG(recording[i]) break; } } if (i == MAX_LINES) { WARN("Max lines reached") } retval = 0; } return retval; } public OnPlayerCommandText(playerid, cmdtext[]) { if (IsPlayerAdmin(playerid)) { if (strcmp(cmdtext, "/ymsg", false, 5) == 0) { if (!cmdtext[5] || !checkpar(playerid, cmdtext[6])) { MSG("ymsg triggered") ShowRandomMessage(); } return 1; } } return 0; } #define TEMP_FILE "ymsg.temp.remove" savefile(playerid) { new File:rfile; new File:test; if ((rfile = fopen(FILE_NAME, io_read))) { test = fopen(TEMP_FILE, io_write); new text[256], i = 0; while (fread(rfile, text)) { switch (i) { case 0: { new index = 0; new num = strval(strtok(text, index)); if (record == playerid) num++; format(text, sizeof (text), "%d %d\r\n", num, gDelay); } case 1: { format(text, sizeof (text), "%s\r\n", makehexstr(gColor)); } } fwrite(test, text); i++; } fclose(rfile); fwrite(test, "\r\n"); if (record == playerid) { fwrite(test, "{\r\n"); for (i = 0; i < MAX_LINES; i++) { if (recording[i][0]) { fwrite(test, recording[i]); fwrite(test, "\r\n"); } } fwrite(test, "}\r\n"); record = INVALID_PLAYER_ID; for (i = 0; i < MAX_LINES; i++) { recording[i][0] = 0; } } fclose(test); fremove(FILE_NAME); rfile = fopen(FILE_NAME, io_write); test = fopen(TEMP_FILE, io_read); while (fread(test, text)) { fwrite(rfile, text); } fclose(rfile); fclose(test); fremove(TEMP_FILE); } else { WARN("Could not open file") return 0; } return 1; } makehexstr(num) { new work; new string[10]; for (new i = 0; i < 8; i++) { work = (num & (0b1111 << (i * 4))) >>> (i * 4); string[7 - i] = (work > 9) ? work + 0x37 : work + 0x30; //((work >= 0) ? work + 0x30 : work + 0x47); } return string; } checkpar(playerid, text[]) { if (IsInteger(text)) { ShowRandomMessage(false, strval(text)); return 1; } else { new tmp[32]; new index = 0; tmp = strtok(text, index); if (strcmp(tmp, "delay", true) == 0) { if (IsInteger(text[index + 1])) { gDelay = strval(strtok(text, index)); MSG("Delay time updated, type \"/ymsg save\" to save") printf("%d", gDelay); } else { WARN("Invalid delay value") } return 1; } else if (strcmp(tmp, "record", true) == 0) { if (record == INVALID_PLAYER_ID) { record = playerid; new text2[128]; format(text2, sizeof (text2), "Recording started, type normally to record - %d lines max", MAX_LINES); MSG(text2) MSG("Type \"/ymsg save\" to save when done or \"/ymsg view\" to view") //printf("%d", record); } else { WARN("Recording already in progress, type \"/ymsg save\"") WARN("to save or \"ymsg cancel\" to cancel if by you") } return 1; } else if (strcmp(tmp, "reload", true) == 0) { ShowRandomMessage(false); MSG("Message settings reloaded") } else if (strcmp(tmp, "cancel", true) == 0) { if (record == playerid) { record = INVALID_PLAYER_ID; for (new i = 0; i < MAX_LINES; i++) { recording[i][0] = 0; } MSG("Recording cancelled") } else { WARN("Access denied") } return 1; } else if (strcmp(tmp, "save", true) == 0) { if (savefile(playerid)) { MSG("Settings saved") } else { MSG("Save error") } return 1; } else if (strcmp(tmp, "color", true) == 0) { tmp = strtok(text, index); if (strlen(tmp) == 8 && IsHex(tmp)) { gColor = hexstr(tmp); MSG("Color updated") } else { WARN("Invalid color code") } return 1; } else if (strcmp(tmp, "view", true) == 0) { if (record == playerid) { MSG("Your recorded text:") for (new i = 0; i < MAX_LINES; i++) { if (recording[i][0]) { SendClientMessage(playerid, gColor, recording[i]); } } } else { WARN("Access denied") } } } return 0; } IsInteger(string[]) { for (new i = 0, j = strlen(string); i < j; i++) { if (string[i] > '9' || string[i] < '0') return 0; } return 1; } IsHex(string[]) { for (new i = 0, j = strlen(string); i < j; i++) { if ((string[i] > '9' || string[i] < '0') && (string[i] > 'F' || string[i] < 'A') && (string[i] > 'f' || string[i] < 'a')) return 0; } return 1; }