Jump to content
GIGN Forum

shine

Mirstīgais
  • Posts

    1472
  • Joined

  • Last visited

Everything posted by shine

  1. 1. Salasāmi ar atstarpēm un pārējiem šitiem. Nedari šādi: public funckija() { dsadas fsadadsa } public funkcija() { } Dari šādi(ievēro vienu atstarpi): public funckija() { dsadas fsadadsa } public funkcija() { } 2. Skaidrākus funkcijas nosaukumus(tādi, kas pastāsta, par ko ir runa). Ko nozīmē public MK()? Kas ir MK? Mortal Kombat? 3. Pcvarus ieteiktu apvienot vienā arrajā un izveido g_Query, lai nav jāveido katru reizi jauns: enum SQL_INFO { HOST, USER, PASSWORD, DATABASE, UPDATE } new g_Query[256] new c_MySqlInfo[SQL_INFO] public plugin_init() { c_MySqlInfo[SQL_INFO:HOST] = register_cvar("monitor_host","localhost") c_MySqlInfo[SQL_INFO:USER] = register_cvar("monitor_uname","root") c_MySqlInfo[SQL_INFO:PASSWORD] = register_cvar("monitor_upw","123") c_MySqlInfo[SQL_INFO:DATABASE] = register_cvar("monitor_dbname","monitor") c_MySqlInfo[SQL_INFO:UPDATE] = register_cvar("monitor_update","15.0") } //un pie connect public DatabaseConnect() { new MySqlInfo[SQL_INFO][64] get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:HOST],63) get_pcvar_string(c_MySqlInfo[SQL_INFO:USER],MySqlInfo[SQL_INFO:USER],63) get_pcvar_string(c_MySqlInfo[SQL_INFO:PASSWORD],MySqlInfo[SQL_INFO:PASSWORD],63) get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:DATABASE],63) formatex(g_Query,255,"CREATE DATABASE IF NOT EXISTS %s",MySqlInfo[SQL_INFO:DATABASE]) SendQuery(g_Query) } 4. Kāpēc tu taisi lieku boolu - db_created, nebūtu vieglāk tam "startloop()" uzlikt tasku uz 1.0? Tāpat, ja neizdosies izveidot datubāzi tu izmanto set_fail_state, kas apstādina pluginu. 5. new Float:timef = get_pcvar_float(pcvar5) Totāls fails, liec pa taisno iekšā: set_task(get_pcvar_float(pcvar5),"update_all",_,_,_,"b") 6. Vispār liec šo plugin_init: set_task(get_pcvar_float(pcvar5), "update_all", _ , _ , _ , "b") un to papildus funkciju nodzēs. 7. public rr() update_details(0,0) *Atstarpes no citām funkcijām. * public rr() update_details(0,0) OR public rr() { update_details(0,0) } 8. is_admin[id] = false if(is_user_bot(id) || is_user_hltv(id)) return PLUGIN_HANDLED if(get_user_flags(id) & ADMIN_BAN) is_admin[id] = true Lieto else pie flag check: if(is_user_bot(id) || is_user_hltv(id)) return PLUGIN_HANDLED if(get_user_flags(id) & ADMIN_BAN) { is_admin[id] = true } else { is_admin[id] = false } Citādi, ja ir admins, tad 2 reizes tiek mainīta bool vērtība. 9. new score_teamct = 0, score_teamt = 0 Nav jēga likt = 0, šis nav C++, bet ir pawn. 10. new maxplayers = 33 Pff, vai nu: #define MAXPLAYERS 33 or raksti to pirms aiz funkcijas(global - karoče virs plugin_init tavā gadījumā). Tu saproti, ka tu veido jaunu mainīgo un piešķir tam vērtību, ik pa 15 sec? 11. for(new i=0; i<maxplayers; i++) { if(is_user_connected(i) && !is_user_bot(i) && !is_user_hltv(i)) { udp2(i) } } Beidzot, kaut kas acīm kaut cik tīkams. (applause). 12. Veido domājošu entity taska vietā: #include <amxmodx> #include <fakemeta> #include <hamsandwich> new pcvar5 new g_HandlerEnt public plugin_init() { //Tavs kods pcvar5 = register_cvar("monitor_update", "15.0") RegisterHam(Ham_Think,"info_target","HandlerThink",1) MakeHandler() } public MakeHandler() { g_HandlerEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")) //Classname nav obligāts. Dzēs šo rindiņu ārā. Es šo uzrakstīju tāpat... set_pev(g_HandlerEnt,pev_classname,"shine_largerthan_3rmx") set_pev(g_HandlerEnt,pev_nextthink,get_gametime() + get_pcvar_float(pcvar5)) } public HandlerThink(Ent) { if(Ent == g_HandlerEnt) { //UPDATE } } Neuztraucies, ka tiek inklūdoti 2 moduļi, tomēr labāks par tasku . 13. Kāds ADMIN_CVAR? Neliec to > pcvar5 = register_cvar("monitor_update", "15.0", ADMIN_CVAR) > pcvar5 = register_cvar("monitor_update", "15.0") 14. is_admin[id] = false if(get_user_flags(id) & ADMIN_BAN) is_admin[id] = true Atkal... izmanto else. 15. new ErC, Handle:sqlc = SQL_Connect(tuple, ErC, gerror, 511) Error un Handle:sqlc izveido kā globalos mainīgos, lai katru reizi nav jātaisa jauni. 16. get_cvar_string("amx_nextmap", nextmap, 32) get_cvar_string("mp_timelimit", timelimit, 9) get_cvar_string("amx_timeleft", timeleft, 9) Izmanto cvar pointerus un iegūsti šos stringus kā pcvarus, jo viņš katru reizi burās cauri visiem cvariem kamēr atrod šos, un šie ir beigās tāpēc šis ēd resus . Šādi: new cp_nextmap public plugin_init() { cp_nextmap = get_cvar_pointer("amx_nextmap") } public iownrmx() { new Nextmap[33] get_pcvar_string(cp_nextmap,Nextmap,32) } 17. maxpl = get_maxplayers() Lieto globalo mainīgo. 18. if(!first_update) { new Handle:query = SQL_PrepareQuery(sqlc, "INSERT INTO other (curmap , nextmap , timelimit , timeleft, curpl, maxpl, scoret, scorect) VALUES ('%s', '%s', '%s', '%s', '%d', '%d', '%d', '%d') ", curmap, nextmap, timelimit, timeleft, curpl, maxpl, teamt, teamct) mk(query) first_update =true } else { new Handle:query = SQL_PrepareQuery(sqlc, "UPDATE other SET curmap = '%s', nextmap = '%s', timelimit = '%s', timeleft = '%s', curpl = '%d', maxpl = '%d', scoret = '%d', scorect = '%d' ",curmap, nextmap, timelimit, timeleft, curpl, maxpl, teamt, teamct) mk(query) } Neveido jaunu Handle:query katru reizi, izveido vai nu global vai arī static, vai arī pirms if/else vienu. 19. public update_details(teamct, teamt) Kāpēc tu to vietā nevarētu izmantot globalos mainīgos, kas tev jau Ir? 20. replace_all(pl_name, 55, "'", "'") > replace_all(pl_name, 55, "'", "\'") MySQL viņš ieliks bez \. 21. switch(num) { case 0: { new Handle:query = SQL_PrepareQuery(SqlC, "INSERT INTO players (pl_name, pl_ip, pl_frags, pl_death, pl_team, pl_admin) VALUES ('%s', '%s', '%d', '%d', '%s', '%s')", pl_name, pl_ip, frags, death, team, is_admin[id] == true ? "1" : "0") mk(query) } case 1: { new Handle:query = SQL_PrepareQuery(SqlC, "UPDATE players SET pl_name = '%s', pl_frags = '%d', pl_death = '%d', pl_team = '%s', pl_admin = '%s' WHERE pl_ip = '%s' ", pl_name, frags, death, team, is_admin[id] == true ? "1" : "0", pl_ip) mk(query) } case 2: { new Handle:query = SQL_PrepareQuery(SqlC, "DELETE FROM players WHERE pl_ip = '%s'", pl_ip) mk(query) } } Netaisi katru reizi jaunu, izmanto to pašu mainīgo, ko jau iepriekš ieteicu. mk(query) iznes ārā no switch. 22. create_table(sqlc, 1, "") create_table(sqlc, 2, "") create_table(sqlc, 3, "") create_table(sqlc, 4, "") ČO ZA FĀK? > Ņem piemēru no šī(iekļauti mainīgie un cits šits no punkta 3. Skatīt augstāk): public DatabaseConnect() { new MySqlInfo[SQL_INFO][64], Query[5][192] get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:HOST],63) get_pcvar_string(c_MySqlInfo[SQL_INFO:USER],MySqlInfo[SQL_INFO:USER],63) get_pcvar_string(c_MySqlInfo[SQL_INFO:PASSWORD],MySqlInfo[SQL_INFO:PASSWORD],63) get_pcvar_string(c_MySqlInfo[SQL_INFO:HOST],MySqlInfo[SQL_INFO:DATABASE],63) g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db) SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511) if(SqlConnection == Empty_Handle) { log_amx(g_Error) return PLUGIN_CONTINUE } formatex(Query[0],255,"CREATE DATABASE IF NOT EXISTS %s",MySqlInfo[SQL_INFO:DATABASE]); SendQuery(g_Query) formatex(Query[1],255,"CREATE TABLE IF NOT EXISTS Players (PlayerName VARCHAR(64), PlayerFrags INT, PlayerDeaths INT, PlayerTeam VARCHAR(3))") formatex(Query[2],255,"CREATE TABLE IF NOT EXISTS Other (Map VARCHAR(33), NextMap VARCHAR(33), TimeLimit VARCHAR(6), TimeLeft VARCHAR(6), TScore INT, CTScore INT, PlayerCount, MaxPlayers)") formatex(Query[3],255,"DELETE * FROM Players") formatex(Query[4],255,"DELETE * FROM Other") SendMultipleQueries(Query,5) } public SendMultipleQueries(Queries[][],Count) { new i for(i = 0; i < Count; i++) { SendQuery(Queries[i]) } } public SendQuery(Query1[]) { SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,511) if(g_SqlTuple != Empty_Handle) { static Handle:Query Query = SQL_PrepareQuery(SqlConnection,Query1) if(!SQL_Execute(Query)) { SQL_QueryError(Query,g_Error,511) log_amx(g_Error) } SQL_FreeHandle(Query) SQL_FreeHandle(SqlConnection) } else { log_amx(g_Error) } } UN punkts nummur divdesmit trīs: public plugin_end() SQL_FreeHandle(tuple) Tā vajag? Kur tu rāvi, ka tā vajag darīt? Kāpēc tu to dari? Pastāsti, kur tu izlasīji, ka tā vajag darīt?! Godīgi sakot, nedomāju, ka tā vajag, bet parādi, kur tu izlasīji, ka vajag, lūdzu. P.S. Monitors ir OK. (thumbsup).
  2. Manuprāt es atradu vainu: PC nepavelk server + cs .
  3. Too much work. Es 45min pie pawn studio nenosēdēšu. Taisam kādu projektu kopā(remix). Nu nejau to Zombie, ar ko sanāca diezgan skaisti , bet kādu normālu, ne pārāk grūti pluginu, kuram būtu sakars ar WEB(maybe), un ko nedēļas laikā pa 1h dienā varētu pabeigt! rmx, ja tev liekas, ka parāk bieži izsauks, tad uztaisi global arrayu, kas satur spēlētāja iepriekšējo niku, un pārbaudi vai ir mainījies pie infochanged, ja ir, tad arrayā ieliec jauno niku un pārbaudi vai ir admins un apdeito MySQL datus. Vispār to infochanged tāpat vajag, jo ja nomaina niku vai komandu, vajag apdeitot monitoru. Pārbaudi vai spēlētājs nav bots un gatavs. Tici man, tavs 0.5 sec tasks jau nav labāks, neatceros vai tur bija kāds sakars ar MySQL datu apdeitošanu, anyway.
  4. Iemācīties norakstīt MySQL datus pareizi.
  5. public client_infochanged(id) { if(get_user_flags(id) & ADMIN_BAN) { //Admin } else { //User } } Šis kods apdeitos un pārbaudīs vai ir admins, kad spēlētājs nomaina niku, team vai jebko citu. Šis ir labākais veids, kā pārbaudīt vai viņš ir admins vai nav, nevajag nekādus papildus connect čekus. remix.cc, kā jau galīgs Bots, pie disconnect admin[id] = false nav pielicis..
  6. Tas bija domāts par X ID replace_all(text,"'","\'"). Hakeris. Mhm .
  7. pl_name = shine pl_frags = 1337 pl_death = 0 pl_team = 1 pl_ip = 1.3.3.7 > pl_name = "\'; DROP TABLE tabula;--" Izejot cauri čekiem: Mēs uzhakojam monitoru. Neticat, ka strādā? Varat paši izmēģināt. EDIT: Debīlais šains aizmirsa, ka cs nikā nevar izmantot '\', tad jau sanāk, ka monitors ir drošs. Pagaidām nevaru iedomāties vēl citu veidu, kā ar Plr name varētu uzhakot, bet nu man tagad 15 minūtes brīvs laiks. Padomāšu.
  8. or Piemēram, ieejot serveri ar niku: Tu vēsi vari nonest savu monitoru.
  9. Saliec atstarpes(paskaties uz manu pluginu), liec visus kodus blokos un indento kodu. Lūdzu. Ieteicams arī komentēt, ko tu kur dari, lai tādi, kas pirmo reizi iebrauc tavā kodā arī kaut ko saprastu, neštukojot 10 minūtes. Variables(mainīgos) ieteicams izmantot nosaukumus, kuri ļautu saprast, ko viņi dara neskatoties uz pārējo kodu. Piemēram: Raksti visus mainīgo nosaukumus tā, lai var saprast. Neraksti: Raksti vainu šādi: Vai arī šādi: Liec g_ priekšā globālajiem mainīgajiem, c_ cvariem, cp_ cvar pointeriem utt.
  10. Čau remix.cc. Sakārto kodu vienreiz, bled!
  11. PHP if(is_user_connected(i) && !is_user_hltv(i) && !is_user_bot(i)) = Ja(spēlētājs ir piekonektējies UN ja spēlētājs !NAV hltv UN ja spēlētājs !NAV bots) Pameklē arī to par MAXPLAYERS. Mācies saprotami kodēt - mans pēdējais plugins(tur viss kods ir vienā čupā?): /* Current Version: 0.7.0 - Description - This plugin tries to simulate Counter-Strike: CZ singleplayer Career missions. Imagine, now you can complete them in both Counter-Strike 1.6 and Condition Zero multiplayer! You start at level 1. Every level missions get harder and harder. As you gain levels you unlock new types of missions. Your level and current mission is automatically saved and loaded on connect and disconnect. There is no max level where you have to stop and restart over. To simulate CZ for CS 1.6 i made tutor support, it looks awesome. This plugin supports players without tutor in CS 1.6 after the first connect. It'll show mission info in status text and chat messages. - Missions - There are five mission types for now: * Kill players * Plant bombs * Defuse bombs * Rescue Hostages * Win rounds There are several conditions for missions: * Headshot - You must complete your mission killing players only in head. Only for Kill missions. * Weapon - You must kill your enemies with a specific weapon. Only for Kill missions. * In one round - You must do your mission in one round. Only for Kill and Hostage missions. Sometimes you'll need to do one round missions several times to complete the actual mission. * Survive - You must complete the mission and survive the round to fully complete the mission. For every mission except win and defuse. * Time - You must complete your mission in time. For all missions. Conditions can be combined to make a different mission every time. - Cvars - amx_czsm_save_by < 1 / 2 > < 1 - IP | 2 - Steam ID. > < Def: 1 > amx_czsm_use_tutor < 1 / 0 > < Use CZ Tutor. Note that players connecting first time without Tutor in CS 1.6 wont see it until he restarts cs and connects to your server again. > < Def: 1 > amx_czsm_min_kill_level < ## > < Min level for killing missions to become available to players. I strongly suggest you to leave this to one, or if you change it then change another missions type minimal level to 1. > < Def: 1 > amx_czsm_min_killweapon_level < ## > < Min level for killing with weapons to become available to players. > < Def: 5 > amx_czsm_min_plant_level < ## > < Min level for planting missions to become available to players. > < Def: 3 > amx_czsm_min_defuse_level < ## > < Min level for defusing missions to become available to players. > < Def: 3 > amx_czsm_min_win_level < ## > < Min level for winning missions to become available to players. > < Def: 7 > amx_czsm_min_hostage_level < ## > < Min level for hostage rescuing missions to become available to players. > < Def: 10 > amx_czsm_min_hs_level < ## > < Min level for headshot missions to become available to players. > < Def: 5 > amx_czsm_min_round_level < ## > < Min level for round missions to become available to players. > < Def: 10 > amx_czsm_min_survive_level < ## > < Min level for survive missions to become available to players. > < Def: 15 > amx_czsm_min_time_level < ## > < Min level for time missions to become available to players. > < Def: 20 > amx_czsm_roundtime_step < ## > < Time step for time missions. If timestep is 60 you can only get time missions with times like - 60, 120, 180, 240.. etc. > < Def: 60 > amx_czsm_max_in_round < 0 / ## > < Max players you have to shoot in one round. Leave 0 to automatically set it to half of server maxplayer limit. If you have 16 slots and it's set to 0, you can have max 8 kills in one round for missions, but if there less than 8 players on your opposing team, you cannot complete your mission. > < Def: 5 > amx_czsm_autocorrect_missions < 0 / 1 > < If you join a cs_ map and your last mission was to defuse a bomb you'll be given a new mission if this is set to 1. > < Def: 0 > - Super Health, Gravity and Speed upgrades for levels - I'm afraid - none. - Future Upgrades - MySQL and VIP escape and ES_ mission types. Maybe some more conditions for missions. NO ML. - ScreenShots - [url=http://img145.imageshack.us/img145/1460/czscr1.jpg]http://img145.imageshack.us/img145/1460/czscr1.jpg[/url] [url=http://img141.imageshack.us/img141/4311/czscr2.jpg]http://img141.imageshack.us/img141/4311/czscr2.jpg[/url] [url=http://img230.imageshack.us/img230/6761/czscr3.jpg]http://img230.imageshack.us/img230/6761/czscr3.jpg[/url] [url=http://img228.imageshack.us/img228/1327/czscr4.jpg]http://img228.imageshack.us/img228/1327/czscr4.jpg[/url] [url=http://img27.imageshack.us/img27/4048/czscr5.jpg]http://img27.imageshack.us/img27/4048/czscr5.jpg[/url] - Change Log - 0.7.0 * Initial Release */ #include <amxmodx> #include <amxmisc> #include <fakemeta> #include <hamsandwich> #include <nvault> #define VERSION "0.7.0" //Maxplayers #define MAXPLAYERS 32 + 1 //Mission Types #define MISSIONS 6 //Weapons #define WEAPONS 30 //Sounds #define SOUNDS 3 //Param count #define MAXPARAMS 10 //Player tasks #define TASK_TUTOR 1111 #define TASK_MISSION 2222 //Global Tasks #define TASK_CHECKTIME 999990 //Map Types #define MAP_DE (1<<1) #define MAP_CS (1<<2) //Difficulty #define DIFFICULTY_VERYEASY 0.25 #define DIFFICULTY_EASY 0.5 #define DIFFICULTY_EASYNORMAL 0.75 #define DIFFICULTY_NORMAL 1.0 #define DIFFICULTY_HARDNORMAL 1.5 #define DIFFICULTY_HARD 2.0 //Cs Teams enum { TEAM_UNASS, TEAM_T, TEAM_CT, TEAM_SPEC } //Mission Types enum { KILL_NORMAL, KILL_WEAPON, PLANT, DEFUSE, WIN, HOSTAGE } //Params enum { PARAM_PLAYER, PARAM_CONST, PARAM_WEAPON, PARAM_HS, PARAM_ROUND, PARAM_SURVIVE, PARAM_TIME, PARAM_TIMEAMT, PARAM_ROUNDTIMES, PARAM_ROUNDTIME_COUNT } //Min & Max param enum { Float:PARAM_MIN, Float:PARAM_MAX } //Tutor color enum { RED = 1, BLUE, YELLOW, GREEN } //Mission status enum { STATUS_NORMAL, STATUS_FAILED } //Sounds enum { SOUND_LVLUP, SOUND_OBJ, SOUND_FAILED } //Mission description. Used to make missions TutorMsg/Chat Msg new const g_MissionDesc[MISSIONS][] = { "Kill enemies", "Kill enemies with", "Plant bombs", "Defuse bombs", "Win rounds", "Rescue hostages" } //Mission param Multipliers new const Float:g_MissionParams[MISSIONS][2] = { {DIFFICULTY_NORMAL , DIFFICULTY_HARD }, //Kill {DIFFICULTY_NORMAL , DIFFICULTY_NORMAL }, //Kill Weapon {DIFFICULTY_NORMAL , DIFFICULTY_HARDNORMAL }, //Plant {DIFFICULTY_NORMAL , DIFFICULTY_HARDNORMAL }, //Defuse {DIFFICULTY_VERYEASY , DIFFICULTY_EASYNORMAL }, //Win {DIFFICULTY_VERYEASY , DIFFICULTY_EASYNORMAL } //Hostage } //Weapon names new g_WeaponNames[WEAPONS][] = { "weapon_p228", 0, "weapon_scout", "weapon_hegrenade", "weapon_xm1014", 0, "weapon_mac10", "weapon_aug", 0, "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550", "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", 0, "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90" } //Sounds new const g_Sounds[SOUNDS][] = { "czsm/levelup.wav", "plats/elevbell1.wav", "buttons/bell1.wav" } //Resources needed to precache for Tutors. new const g_TutorPrecache[][] = { "gfx/career/icon_!.tga", "gfx/career/icon_!-bigger.tga", "gfx/career/icon_i.tga", "gfx/career/icon_i-bigger.tga", "gfx/career/icon_skulls.tga", "gfx/career/round_corner_ne.tga", "gfx/career/round_corner_nw.tga", "gfx/career/round_corner_se.tga", "gfx/career/round_corner_sw.tga", "resource/TutorScheme.res", "resource/UI/TutorTextWindow.res" } //Map parameters(MAP_DE,MAP_CS). new g_MapParams //Holds Hostage_Entity count(max hostages). new g_MapParamsCount //Hostages alive in game. new g_GameHostages //Handler entity ID. new g_HandlerEnt //Has anyone got a time mission? new bool:g_TimerOn //Server maxplayers new g_MaxPlayers //Roundtime in seconds. Used in time missions. new g_RoundTimerStart //Roundtime left(in seconds). Used in time missions. new g_RoundTimer //RoundTime Amount Checked every round. Used for Time missions. new g_MaxRoundTimeAmt //There variables hold the message id's. new g_MsgSay,g_MsgTutor,g_MsgTutorClose new g_MsgStatusText,g_MsgStatusValue //Vault ID new g_Vault //Player level new g_PlayerLevel[MAXPLAYERS] //Player mission type(ex. Kill, plant bomb, defuse bomb e.c) new g_PlayerMissionType[MAXPLAYERS] //Mission Time status new g_PlayerMissionTimeStatus[MAXPLAYERS] //Can player complete his mission in the current round(for kills in round u.c? new g_PlayerMissionStatus[MAXPLAYERS] //Specific Mission params(like Hs/Survive round,Kill e.c). new g_PlayerMissionParams[MAXPLAYERS][MAXPARAMS] //Buttons player was holding last cmdstart frame. new g_PlayerOldButtons[MAXPLAYERS] //Player Holding IN_SCORE(TAB) button. new g_PlayerInScore[MAXPLAYERS] //Can show mission objectives through StatusText. new bool:g_PlayerCanShow[MAXPLAYERS] //Is an info message currently displayed to player? new bool:g_PlayerInfoMsg[MAXPLAYERS] //Tutur On for player | Player has tutor available. new bool:g_PlayerHasTutor[MAXPLAYERS],bool:g_PlayerHasTutor2[MAXPLAYERS] //Is true if player just connected and hasn't spawned. new bool:g_PlayerJustConnected[MAXPLAYERS] //Cvars new /*c_save_type,*/c_save_by,c_use_tutor new c_roundtime_step new c_min_level[MISSIONS] new c_min_hs_level,c_min_round_level,c_min_survive_level,c_min_time_level new c_max_in_round new c_autocorrect_missions //Cvar Pointers new cp_roundtime,cp_freezetime public plugin_init() { register_plugin("Advanced Condition Zero Style Career Missions",VERSION,"shine") register_cvar("czscm",VERSION,FCVAR_SERVER|FCVAR_SPONLY) //Debug register_clcmd("say /resetstats","CmdReset") //Cvars //In future releases //c_save_type = register_cvar("amx_czsm_save_type","1") //1 - nVault, 2 - MySQL c_save_by = register_cvar("amx_czsm_save_by","1") //1 - Ip, 2 - SteamID c_use_tutor = register_cvar("amx_czsm_use_tutor","1") c_roundtime_step = register_cvar("amx_czsm_roundtime_step","60") //Sec c_min_level[KILL_NORMAL] = register_cvar("amx_czsm_min_kill_level","1") c_min_level[KILL_WEAPON] = register_cvar("amx_czsm_min_killweapon_level","5") c_min_level[PLANT] = register_cvar("amx_czsm_min_plant_level","3") c_min_level[DEFUSE] = register_cvar("amx_czsm_min_defuse_level","3") c_min_level[WIN] = register_cvar("amx_czsm_min_win_level","7") c_min_level[HOSTAGE] = register_cvar("amx_czsm_min_hostage_level","10") c_min_hs_level = register_cvar("amx_czsm_min_hs_level","5") c_min_round_level = register_cvar("amx_czsm_min_round_level","10") c_min_survive_level = register_cvar("amx_czsm_min_survive_level","15") c_min_time_level = register_cvar("amx_czsm_min_time_level","20") c_max_in_round = register_cvar("amx_czsm_max_in_round","5") //0 - maxplayers / 2 c_autocorrect_missions = register_cvar("amx_czsm_autocorrect_missions","0") //Cvar Pointers cp_roundtime = get_cvar_pointer("mp_roundtime") cp_freezetime = get_cvar_pointer("mp_freezetime") //Events register_event("DeathMsg","PlayerDeath","a") register_event("HLTV","RoundStart","a","1=0","2=0") register_event("TextMsg","HostageAliveCheck","b","1=4","2=#Killed_Hostage") register_logevent("RoundEnd",2,"1=Round_End") register_logevent("PlayerRescueHostage",3,"1=triggered","2=Rescued_A_Hostage") register_logevent("PlayerPlantedBomb",3,"2=Planted_The_Bomb") register_logevent("PlayerDefusedBomb",3,"2=Defused_The_Bomb") //Audio Events register_event("SendAudio","TerroristsWin","a","2=%!MRAD_terwin") register_event("SendAudio","CTWin","a","2=%!MRAD_ctwin") //Fakemeta Forwards register_forward(FM_CmdStart,"PlayerCmdStart") //Ham Forwards RegisterHam(Ham_Spawn,"player","PlayerSpawn",1) RegisterHam(Ham_Think,"info_target","HandlerThink") //Messages g_MsgSay = get_user_msgid("SayText") g_MsgTutor = get_user_msgid("TutorText") g_MsgTutorClose = get_user_msgid("TutorClose") g_MsgStatusText = get_user_msgid("StatusText") g_MsgStatusValue = get_user_msgid("StatusValue") //Hook Messages register_message(g_MsgStatusText,"BlockMessage") register_message(g_MsgStatusValue,"BlockMessage") //Open nVault g_Vault = nvault_open("czstyle_missions") //Get maxplayers g_MaxPlayers = get_maxplayers() //Make the time mission handler MakeHandler() //Check Map Params CheckMap() //Start Configs StartCfg() } public MakeHandler() { g_HandlerEnt = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")) set_pev(g_HandlerEnt,pev_classname,"CZSMHandler") set_pev(g_HandlerEnt,pev_nextthink,get_gametime() + 1.0) } public CheckMap() { new tVar = -1 if ( engfunc(EngFunc_FindEntityByString,-1,"classname","info_bomb_target") || engfunc(EngFunc_FindEntityByString,-1,"classname","func_bomb_target") ) { g_MapParams |= MAP_DE } while((tVar = engfunc(EngFunc_FindEntityByString,tVar,"classname","hostage_entity")) != 0) { if(!g_MapParamsCount) g_MapParams |= MAP_CS g_MapParamsCount++ } } public StartCfg() { g_RoundTimerStart = floatround(get_pcvar_float(cp_roundtime) * 60.0) g_RoundTimer = g_RoundTimerStart g_GameHostages = g_MapParamsCount g_MaxRoundTimeAmt = floatround(get_pcvar_float(cp_roundtime) * 60) / get_pcvar_num(c_roundtime_step) } //Debug public CmdReset(id) { new i g_PlayerLevel[id] = 0 g_PlayerMissionType[id] = 0 for(i = 0; i < 4; i++) g_PlayerMissionParams[id][i] = 0 SaveMission(id) } public plugin_precache() { new i for(i = 0; i < sizeof g_TutorPrecache; i++) precache_generic(g_TutorPrecache[i]) for(i = 0; i < sizeof g_Sounds; i++) precache_sound(g_Sounds[i]) } public client_putinserver(id) { if(!is_user_bot(id)) { g_PlayerJustConnected[id] = true if(!get_pcvar_num(c_use_tutor)) g_PlayerHasTutor[id] = false set_task(0.3,"CheckPlayerInfo",id) LoadMission(id) } } public client_disconnect(id) { if(!is_user_bot(id)) { new i if(g_PlayerMissionParams[id][PARAM_ROUND]) { g_PlayerMissionParams[id][PARAM_PLAYER] = 0 } SaveMission(id) g_PlayerLevel[id] = 0 g_PlayerMissionType[id] = 0 g_PlayerMissionStatus[id] = STATUS_NORMAL g_PlayerMissionTimeStatus[id] = STATUS_NORMAL g_PlayerInfoMsg[id] = false g_PlayerInScore[id] = false g_PlayerCanShow[id] = true for(i = 0; i < MAXPARAMS; i++) g_PlayerMissionParams[id][i] = 0 remove_task(id + TASK_TUTOR) remove_task(id + TASK_MISSION) } CheckStatus() } public CheckPlayerInfo(id) { new Info[33] get_user_info(id,"cl_tutor",Info,32) if(Info[0] != '1') { client_cmd(id,"setinfo cl_tutor 1") g_PlayerHasTutor2[id] = false } else { g_PlayerHasTutor2[id] = true } if(get_pcvar_num(c_use_tutor) && g_PlayerHasTutor2[id]) { g_PlayerHasTutor[id] = true } else { g_PlayerHasTutor[id] = false } } public PlayerDeath() { new Killer = read_data(1) new Victim = read_data(2) RemoveTutor(Victim + TASK_TUTOR) if(g_PlayerMissionParams[Killer][PARAM_ROUND]) CheckPlayerMission(Killer,1) if(g_PlayerMissionTimeStatus[Killer] == STATUS_FAILED) return PLUGIN_CONTINUE if ( Killer != Victim && get_user_team(Killer) != get_user_team(Victim) && ( g_PlayerMissionType[Killer] == KILL_NORMAL || g_PlayerMissionType[Killer] == KILL_WEAPON ) && !is_user_bot(Killer) && is_user_alive(Killer) ) { if(g_PlayerMissionType[Killer] == KILL_NORMAL) { new HeadShot = read_data(3) if(g_PlayerMissionParams[Killer][PARAM_HS] && HeadShot || !g_PlayerMissionParams[Killer][PARAM_HS]) { g_PlayerMissionParams[Killer][PARAM_PLAYER]++ client_cmd(Killer,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) if(!g_PlayerMissionParams[Killer][PARAM_SURVIVE]) { CheckPlayerMission(Killer,1) } else { CheckPlayerMission(Killer,0) } } } else if(g_PlayerMissionType[Killer] == KILL_WEAPON) { new Weapon[16],wWeapon[16],HeadShot read_data(4,Weapon,15) HeadShot = read_data(3) if(equal(Weapon,"grenade")) { formatex(wWeapon,15,"%s",g_WeaponNames[g_PlayerMissionParams[Killer][PARAM_WEAPON]][9]) } else { formatex(wWeapon,15,"%s",g_WeaponNames[g_PlayerMissionParams[Killer][PARAM_WEAPON]][7]) } if(equal(Weapon,wWeapon)) { if(g_PlayerMissionParams[Killer][PARAM_HS] && HeadShot || !g_PlayerMissionParams[Killer][PARAM_HS]) { g_PlayerMissionParams[Killer][PARAM_PLAYER]++ client_cmd(Killer,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) if(!g_PlayerMissionParams[Killer][PARAM_SURVIVE]) { CheckPlayerMission(Killer,1) } else { CheckPlayerMission(Killer,0) } } } } } CheckStatus() return PLUGIN_CONTINUE } public RoundEnd() { new i,TutorOn = get_pcvar_num(c_use_tutor) for(i = 0; i < MAXPLAYERS; i++) { if(is_user_connected(i)) { if(TutorOn && g_PlayerHasTutor2[i]) g_PlayerHasTutor[i] = true else g_PlayerHasTutor[i] = false if(g_PlayerMissionParams[i][PARAM_SURVIVE] && is_user_alive(i)) CheckPlayerMission(i,1) if(g_PlayerMissionParams[i][PARAM_ROUND] || g_PlayerMissionParams[i][PARAM_SURVIVE]) { g_PlayerMissionParams[i][PARAM_PLAYER] = 0 } g_PlayerMissionStatus[i] = STATUS_NORMAL g_PlayerMissionTimeStatus[i] = STATUS_NORMAL } } } public PlayerRescueHostage() { new LogArgs[128],Name[33],i read_logargv(0,LogArgs,127) parse_loguser(LogArgs,Name,32) new id = get_user_index(Name) if(g_PlayerMissionType[id] == HOSTAGE && !is_user_bot(id) && g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) { g_PlayerMissionParams[id][PARAM_PLAYER]++ client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) if(!g_PlayerMissionParams[id][PARAM_SURVIVE]) { CheckPlayerMission(id,1) } else { CheckPlayerMission(id,0) } } g_GameHostages-- for(i = 0; i < MAXPLAYERS; i++) { if( is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == HOSTAGE && i != id && g_GameHostages > g_PlayerMissionParams[i][PARAM_PLAYER] && g_PlayerMissionParams[i][PARAM_ROUND] ) { if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED]) g_PlayerMissionStatus[i] = STATUS_FAILED CheckPlayerMission(i,0) } } } public RoundStart() { g_TimerOn = false remove_task(TASK_CHECKTIME) set_task(get_pcvar_float(cp_freezetime),"CheckTimer",TASK_CHECKTIME) } public HostageAliveCheck() { new i g_GameHostages-- for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == HOSTAGE && g_GameHostages > g_PlayerMissionParams[i][PARAM_PLAYER] && g_PlayerMissionParams[i][PARAM_ROUND]) { if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED]) g_PlayerMissionStatus[i] = STATUS_FAILED CheckPlayerMission(i,0) } } } public CheckTimer() { new bool:AnyoneHasTimer,i for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i) && g_PlayerMissionParams[i][PARAM_TIME]) { AnyoneHasTimer = true break } } if(AnyoneHasTimer) { g_RoundTimerStart = floatround(get_pcvar_float(cp_roundtime) * 60.0) g_RoundTimer = g_RoundTimerStart g_TimerOn = true } else { g_TimerOn = false } } public PlayerPlantedBomb() { new LogArgs[128],Name[33],i read_logargv(0,LogArgs,127) parse_loguser(LogArgs,Name,32) new id = get_user_index(Name) if(g_PlayerMissionType[id] == PLANT && !is_user_bot(id) && g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) { g_PlayerMissionParams[id][PARAM_PLAYER]++ client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) if(!g_PlayerMissionParams[id][PARAM_SURVIVE]) { CheckPlayerMission(id,1) } else { CheckPlayerMission(id,0) } } for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == PLANT && i != id) { if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED]) g_PlayerMissionStatus[i] = STATUS_FAILED CheckPlayerMission(i,0) } } } public PlayerDefusedBomb() { new LogArgs[128],Name[33],i read_logargv(0,LogArgs,127) parse_loguser(LogArgs,Name,32) new id = get_user_index(Name) if(g_PlayerMissionType[id] == DEFUSE && !is_user_bot(id) && g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) { g_PlayerMissionParams[id][PARAM_PLAYER]++ client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) if(!g_PlayerMissionParams[id][PARAM_SURVIVE]) { CheckPlayerMission(id,1) } else { CheckPlayerMission(id,0) } } for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionType[i] == DEFUSE && i != id) { if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED]) g_PlayerMissionStatus[i] = STATUS_FAILED CheckPlayerMission(i,0) } } } public TerroristsWin() { new i for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i) && get_user_team(i) == TEAM_T && !is_user_bot(i) && g_PlayerMissionType[i] == WIN && g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) { g_PlayerMissionParams[i][PARAM_PLAYER]++ client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) CheckPlayerMission(i,1) } } } public CTWin() { new i for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i) && get_user_team(i) == TEAM_CT && !is_user_bot(i) && g_PlayerMissionType[i] == WIN && g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) { g_PlayerMissionParams[i][PARAM_PLAYER]++ client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_OBJ]) CheckPlayerMission(i,1) } } } public PlayerCmdStart(id,Uc_Handle,Seed) { static Buttons Buttons = get_uc(Uc_Handle,UC_Buttons) if(Buttons & IN_SCORE && !(g_PlayerOldButtons[id] & IN_SCORE)) { g_PlayerInScore[id] = true if(!g_PlayerInfoMsg[id]) { CheckPlayerMission(id,0) } } else if(!(Buttons & IN_SCORE) && g_PlayerOldButtons[id] & IN_SCORE) { g_PlayerInScore[id] = false if(!g_PlayerInfoMsg[id]) { if(g_PlayerHasTutor[id]) { RemoveTutor(id + TASK_TUTOR) } else { HideStatusText(id) } } } g_PlayerOldButtons[id] = Buttons return FMRES_IGNORED } public PlayerSpawn(id) { if(!is_user_alive(id) || is_user_bot(id)) return HAM_IGNORED CheckStatus() //RemoveTutor(id +TASK_TUTOR) if(g_PlayerJustConnected[id]) { g_PlayerJustConnected[id] = false new Text[192],Level[4] formatex(Level,3,"%d",g_PlayerLevel[id]) if(g_PlayerHasTutor[id]) { formatex(Text,191,"Welcome to CZ Style Missions Mod!^n^n%s%s.",g_PlayerLevel[id] == 0 ? "Hello there Newb. Is this the first time you play here?^nDon't worry! Just complete missions displayed here to level up" : "Welcome back! You're on level ", g_PlayerLevel[id] == 0 ? "" : Level ) g_PlayerInfoMsg[id] = true MakeTutor(id,Text,YELLOW,10.0) } else { formatex(Text,191,"^x04[AMXX]^x01 Welcome to CZ Style Missions Mod!") ColorPrint(id,Text) formatex(Text,191,"^x04[AMXX]^x01 %s%s.",g_PlayerLevel[id] == 0 ? "Hello there Newb. Is this the first time you play here?^nDon't worry! Just complete missions displayed in chat to level up" : "Welcome back! You're on level ", g_PlayerLevel[id] == 0 ? "" : Level ) g_PlayerInfoMsg[id] = false ColorPrint(id,Text) } if(!g_PlayerLevel[id]) { g_PlayerLevel[id] = 1 MakeMission(id,g_PlayerLevel[id],0) } else { if ( ( ( ( g_PlayerMissionType[id] == PLANT || g_PlayerMissionType[id] == DEFUSE ) && !(g_MapParams & MAP_DE) ) || ( g_PlayerMissionType[id] == HOSTAGE && !(g_MapParams & MAP_CS) ) ) && get_pcvar_num(c_autocorrect_missions) ) { MakeMission(id,g_PlayerLevel[id]) } if(g_PlayerMissionType[id] == HOSTAGE && g_PlayerMissionParams[id][PARAM_ROUND] && g_PlayerMissionParams[id][PARAM_CONST] > g_MapParamsCount && get_pcvar_num(c_autocorrect_missions)) { g_PlayerMissionParams[id][PARAM_CONST] = g_MapParamsCount } if(g_PlayerMissionParams[id][PARAM_TIMEAMT] > g_MaxRoundTimeAmt) g_PlayerMissionParams[id][PARAM_TIMEAMT] = g_MaxRoundTimeAmt } set_task(10.1,"CheckPlayerMissionT",id + TASK_MISSION) return HAM_IGNORED } if(g_PlayerMissionParams[id][PARAM_TIMEAMT] > g_MaxRoundTimeAmt) g_PlayerMissionParams[id][PARAM_TIMEAMT] = g_MaxRoundTimeAmt g_PlayerInScore[id] = false //remove_task(id + TASK_TUTOR) if(!task_exists(id + TASK_MISSION)) CheckPlayerMission(id,0) return HAM_IGNORED } public HandlerThink(Ent) { if(Ent == g_HandlerEnt) { if(g_TimerOn && g_RoundTimer) { g_RoundTimer-- static i,TimePassed,PlayerTimeLeft TimePassed = g_RoundTimerStart - g_RoundTimer for(i = 0; i < MAXPLAYERS; i++) { if ( is_user_alive(i) && !is_user_bot(i) && g_PlayerMissionParams[i][PARAM_TIME] && g_PlayerMissionTimeStatus[i] == STATUS_NORMAL ) { PlayerTimeLeft = (g_PlayerMissionParams[i][PARAM_TIMEAMT] * 60) - TimePassed if(PlayerTimeLeft <= 0) { if(g_PlayerMissionParams[i][PARAM_PLAYER] < g_PlayerMissionParams[i][PARAM_CONST]) { g_PlayerMissionTimeStatus[i] = STATUS_FAILED CheckPlayerMission(i,0) } } else { set_hudmessage(255,255,255,-1.0,0.90,0,6.0,1.0) show_hudmessage(i, "Mission Time: %d seconds.",PlayerTimeLeft) } } } } set_pev(Ent,pev_nextthink,get_gametime() + 1.0) } return HAM_IGNORED } public BlockMessage(MsgID,MsgDest,id) { if(!g_PlayerHasTutor[id] && g_PlayerInScore[id]) { new Args[3] get_msg_arg_string(2,Args,2) if(Args[0] != 'L' || Args[1] != 'v' || Args[2] != 'l') { return PLUGIN_HANDLED } } return PLUGIN_CONTINUE } MakeMission(id,Level,UpdateTutor = 1) { new i,Weapon = -1,Float:DifficultyMulti = DIFFICULTY_NORMAL g_PlayerMissionType[id] = RandomMission(Level) if(g_PlayerMissionType[id] < 0) return 1 for(i = 0; i < MAXPARAMS; i++) g_PlayerMissionParams[id][i] = 0 if(g_PlayerMissionType[id] == KILL_WEAPON) { while(Weapon < 0) { Weapon = random_num(0,WEAPONS - 1) if(g_WeaponNames[Weapon][0] == 0) Weapon = -1 } g_PlayerMissionParams[id][PARAM_WEAPON] = Weapon if(Weapon != CSW_HEGRENADE - 1) { if(get_pcvar_num(c_min_hs_level) <= Level) g_PlayerMissionParams[id][PARAM_HS] = random_num(0,1) if(get_pcvar_num(c_min_round_level) <= Level) { g_PlayerMissionParams[id][PARAM_ROUND] = random_num(0,1) } } } else if(g_PlayerMissionType[id] == KILL_NORMAL) { if(Weapon != CSW_HEGRENADE - 1) { if(get_pcvar_num(c_min_hs_level) <= Level) g_PlayerMissionParams[id][PARAM_HS] = random_num(0,1) if(get_pcvar_num(c_min_round_level) <= Level) g_PlayerMissionParams[id][PARAM_ROUND] = random_num(0,1) } } if(g_PlayerMissionType[id] == HOSTAGE ) { if(get_pcvar_num(c_min_round_level) <= Level) g_PlayerMissionParams[id][PARAM_ROUND] = random_num(0,1) } if(g_PlayerMissionType[id] != DEFUSE && g_PlayerMissionType[id] != WIN && get_pcvar_num(c_min_survive_level) <= Level) { g_PlayerMissionParams[id][PARAM_SURVIVE] = random_num(0,1) if(g_PlayerMissionParams[id][PARAM_SURVIVE]) { DifficultyMulti *= DIFFICULTY_EASYNORMAL } } if(!g_PlayerMissionParams[id][PARAM_ROUND] && g_PlayerMissionType[id] != DEFUSE && get_pcvar_num(c_min_time_level) <= Level) { g_PlayerMissionParams[id][PARAM_TIME] = random_num(0,1) if(g_PlayerMissionParams[id][PARAM_TIME]) { i = random_num(1,g_MaxRoundTimeAmt) g_PlayerMissionParams[id][PARAM_TIMEAMT] = i DifficultyMulti *= DIFFICULTY_NORMAL / 4 * i } } //Yes, i'm making variables. static Float:Rand,Float:Lvl,MaxInRound Rand = random_float ( g_MissionParams[g_PlayerMissionType[id]][PARAM_MIN], g_MissionParams[g_PlayerMissionType[id]][PARAM_MAX] ) Lvl = float(Level) g_PlayerMissionParams[id][PARAM_CONST] = floatround(Rand * Lvl * DifficultyMulti) if(g_PlayerMissionParams[id][PARAM_CONST] < 1) g_PlayerMissionParams[id][PARAM_CONST] = 1 if(g_PlayerMissionParams[id][PARAM_CONST] < 2 && g_PlayerMissionParams[id][PARAM_ROUND]) g_PlayerMissionParams[id][PARAM_CONST] = 2 MaxInRound = get_pcvar_num(c_max_in_round) ? get_pcvar_num(c_max_in_round) : g_MaxPlayers / 2 if(g_PlayerMissionParams[id][PARAM_ROUND] || g_PlayerMissionParams[id][PARAM_TIME]) { if(g_PlayerMissionParams[id][PARAM_CONST] > MaxInRound && (g_PlayerMissionType[id] == KILL_NORMAL || g_PlayerMissionType[id] == KILL_WEAPON)) { g_PlayerMissionParams[id][PARAM_ROUNDTIMES] = g_PlayerMissionParams[id][PARAM_CONST] / MaxInRound + ((g_PlayerMissionParams[id][PARAM_CONST] % MaxInRound > 0) ? 1 : 0) g_PlayerMissionParams[id][PARAM_CONST] = MaxInRound } else if(g_PlayerMissionParams[id][PARAM_CONST] > g_MapParamsCount && g_PlayerMissionType[id] == HOSTAGE) { g_PlayerMissionParams[id][PARAM_ROUNDTIMES] = g_PlayerMissionParams[id][PARAM_CONST] / g_MapParamsCount + ((g_PlayerMissionParams[id][PARAM_CONST] % g_MapParamsCount != 0) ? 1 : 0) g_PlayerMissionParams[id][PARAM_CONST] = g_MapParamsCount } } new Plrs[3] for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i)) { switch(get_user_team(i)) { case TEAM_T : Plrs[TEAM_T]++ case TEAM_CT : Plrs[TEAM_CT]++ } } } if((g_PlayerMissionType[id] == KILL_NORMAL || g_PlayerMissionType[id] == KILL_WEAPON) && g_PlayerMissionParams[id][PARAM_ROUND]) { if( g_PlayerMissionParams[id][PARAM_CONST] - g_PlayerMissionParams[id][PARAM_PLAYER] > Plrs[get_user_team(id) == TEAM_CT ? TEAM_T : TEAM_CT] ) { if(g_PlayerMissionTimeStatus[id] == STATUS_NORMAL) client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_FAILED]) g_PlayerMissionStatus[id] = STATUS_FAILED } else { g_PlayerMissionStatus[id] = STATUS_NORMAL } } if(UpdateTutor) CheckPlayerMission(id,0) return 1 } public CheckPlayerMissionT(taskID) { new id = taskID - TASK_MISSION CheckPlayerMission(id,0) } public CheckPlayerMission(id,CheckWin) { static Text[256],sMission[33],TimeStr[16],RoundTimeStr[33] if(g_PlayerMissionParams[id][PARAM_PLAYER] > g_PlayerMissionParams[id][PARAM_CONST]) { g_PlayerMissionParams[id][PARAM_PLAYER] = g_PlayerMissionParams[id][PARAM_CONST] } if ( g_PlayerMissionParams[id][PARAM_PLAYER] == g_PlayerMissionParams[id][PARAM_CONST] && g_PlayerMissionParams[id][PARAM_CONST] && CheckWin ) { if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] > 0) { g_PlayerMissionParams[id][PARAM_ROUNDTIME_COUNT]++ g_PlayerMissionParams[id][PARAM_PLAYER] = 0 } if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] == g_PlayerMissionParams[id][PARAM_ROUNDTIME_COUNT]) { static i g_PlayerLevel[id]++ formatex(Text,191,"%sMission Complete! You're now on level %s%d%s!", g_PlayerHasTutor[id] == false ? "^x04[Mission]^x01 " : "", g_PlayerHasTutor[id] == false ? "^x03" : "", g_PlayerLevel[id], g_PlayerHasTutor[id] == false ? "^x01" : "", g_PlayerHasTutor[id] == false ? "^x03" : "" ) if(g_PlayerHasTutor[id]) { g_PlayerInfoMsg[id] = true MakeTutor(id,Text,GREEN,4.9) } else { ColorPrint(id,Text) } g_PlayerMissionType[id] = 0 for(i = 0; i < MAXPARAMS; i++) g_PlayerMissionParams[id][i] = 0 MakeMission(id,g_PlayerLevel[id],0) set_task(5.0,"CheckPlayerMissionT",id + TASK_MISSION) client_cmd(id,"spk ^"%s^"",g_Sounds[SOUND_LVLUP]) } return PLUGIN_CONTINUE } if(!is_user_alive(id)) return PLUGIN_CONTINUE if(g_PlayerMissionType[id] == KILL_WEAPON) { formatex(sMission,32,"%s ",g_WeaponNames[g_PlayerMissionParams[id][PARAM_WEAPON]][7]) } if(g_PlayerMissionParams[id][PARAM_TIME]) { formatex(TimeStr,15,"in %d seconds ",g_PlayerMissionParams[id][PARAM_TIMEAMT] * 60) } if(g_PlayerMissionParams[id][PARAM_ROUNDTIMES] > 0) { formatex(RoundTimeStr,32," and do it %d/%d times",g_PlayerMissionParams[id][PARAM_ROUNDTIME_COUNT],g_PlayerMissionParams[id][PARAM_ROUNDTIMES]) } else { RoundTimeStr[0] = 0 } // Line In Time // Weapon Survive // Level Desc ROUND // Level Text D W HS P/C formatex(Text,255,"%s: %d%s[Mission] %s %s%s%s%s%s- %d/%d%s.", g_PlayerHasTutor[id] == true ? "Current Level" : "Lvl", g_PlayerLevel[id], g_PlayerHasTutor[id] == true ? "^n" : " -- ", g_MissionDesc[g_PlayerMissionType[id]], g_PlayerMissionType[id] == KILL_WEAPON ? sMission : "", g_PlayerMissionParams[id][PARAM_HS] == 1 ? "with headshot " : "", g_PlayerMissionParams[id][PARAM_ROUND] == 1 ? "in one round " : "", g_PlayerMissionParams[id][PARAM_TIME] == 1 ? TimeStr : "", g_PlayerMissionParams[id][PARAM_SURVIVE] == 1 ? "and survive " : "", g_PlayerMissionParams[id][PARAM_PLAYER], g_PlayerMissionParams[id][PARAM_CONST], RoundTimeStr ) if(g_PlayerHasTutor[id]) { static Color if(g_PlayerMissionStatus[id] == STATUS_FAILED || g_PlayerMissionTimeStatus[id] == STATUS_FAILED) Color = RED else if(g_PlayerMissionParams[id][PARAM_PLAYER] == 0) Color = BLUE else if(g_PlayerMissionParams[id][PARAM_PLAYER] == g_PlayerMissionParams[id][PARAM_CONST]) Color = GREEN else Color = YELLOW if(g_PlayerInScore[id]) { MakeTutor(id,Text,Color) } } else { if(g_PlayerInScore[id]) { MakeStatusText(id,Text) } } return PLUGIN_CONTINUE } public CheckStatus() { new Plrs[3],i for(i = 0; i < MAXPLAYERS; i++) { if(is_user_alive(i)) { switch(get_user_team(i)) { case TEAM_T : Plrs[TEAM_T]++ case TEAM_CT : Plrs[TEAM_CT]++ } } } for(i = 0; i < MAXPLAYERS; i++) { if((g_PlayerMissionType[i] == KILL_NORMAL || g_PlayerMissionType[i] == KILL_WEAPON) && g_PlayerMissionParams[i][PARAM_ROUND] && is_user_alive(i)) { if( g_PlayerMissionParams[i][PARAM_CONST] - g_PlayerMissionParams[i][PARAM_PLAYER] > Plrs[get_user_team(i) == TEAM_CT ? TEAM_T : TEAM_CT] ) { if(g_PlayerMissionTimeStatus[i] == STATUS_NORMAL) client_cmd(i,"spk ^"%s^"",g_Sounds[SOUND_FAILED]) g_PlayerMissionStatus[i] = STATUS_FAILED } else { g_PlayerMissionStatus[i] = STATUS_NORMAL } } } } //Stocks RandomMission(Level) { new Nums[MISSIONS] = {-1,...},i,x for(i = 0; i < MISSIONS; i++) { if ( get_pcvar_num(c_min_level[i]) > Level || ( ( ( i == PLANT || i == DEFUSE ) && !(g_MapParams & MAP_DE) ) || ( i == HOSTAGE && !(g_MapParams & MAP_CS) ) ) ) { continue } Nums[x] = i x++ } if(Nums[0] == -1) { return -1 } else { return Nums[random_num(0,x - 1)] } return -1 } MakeTutor(id,Text[],Color,Float:Time = 0.0) { message_begin(MSG_ONE_UNRELIABLE,g_MsgTutor,_,id) write_string(Text) write_byte(0) write_short(0) write_short(0) write_short(1<<Color) message_end() if(Time != 0.0) { set_task(Time,"RemoveTutor",id + TASK_TUTOR) } } MakeStatusText(id,Text[]) { message_begin(MSG_ONE_UNRELIABLE,g_MsgStatusText,_,id) write_byte(0) write_string(Text) message_end() } HideStatusText(id) { message_begin(MSG_ONE_UNRELIABLE,g_MsgStatusText,_,id) write_byte(0) write_string("1 %c1: %p2^n2 %h: %i3%%") message_end() message_begin(MSG_ONE_UNRELIABLE,g_MsgStatusValue,_,id) write_byte(2) write_short(1) message_end() } public RemoveTutor(taskID) { new id = taskID - TASK_TUTOR g_PlayerInfoMsg[id] = false message_begin(MSG_ONE_UNRELIABLE,g_MsgTutorClose,_,id) message_end() } ColorPrint(id,Text[]) { message_begin(MSG_ONE_UNRELIABLE,g_MsgSay,_,id) write_byte(id) write_string(Text) message_end() } //Vault public SaveMission(Player) { new SteamID_IP[33],Key[64],Data[256] get_pcvar_num(c_save_by) == 1 ? get_user_ip(Player,SteamID_IP,32,1) : get_user_authid(Player,SteamID_IP,32) formatex(Key,63,"%s_msn",SteamID_IP) formatex(Data,255,"%d %d %d %d %d %d %d %d %d %d %d %d", g_PlayerLevel[Player], g_PlayerMissionType[Player], g_PlayerMissionParams[Player][PARAM_PLAYER], g_PlayerMissionParams[Player][PARAM_CONST], g_PlayerMissionParams[Player][PARAM_WEAPON], g_PlayerMissionParams[Player][PARAM_HS], g_PlayerMissionParams[Player][PARAM_ROUND], g_PlayerMissionParams[Player][PARAM_SURVIVE], g_PlayerMissionParams[Player][PARAM_TIME], g_PlayerMissionParams[Player][PARAM_TIMEAMT], g_PlayerMissionParams[Player][PARAM_ROUNDTIMES], g_PlayerMissionParams[Player][PARAM_ROUNDTIME_COUNT] ) nvault_set(g_Vault,Key,Data) } public LoadMission(Player) { new SteamID_IP[33],Key[64],Data[256],tStr[MAXPARAMS + 2][6] get_pcvar_num(c_save_by) == 1 ? get_user_ip(Player,SteamID_IP,32,1) : get_user_authid(Player,SteamID_IP,32) formatex(Key,63,"%s_msn",SteamID_IP) nvault_get(g_Vault,Key,Data,255) parse ( Data, tStr[0],5, tStr[1],5, tStr[2],5, tStr[3],5, tStr[4],5, tStr[5],5, tStr[6],5, tStr[7],5, tStr[8],5, tStr[9],5, tStr[10],5, tStr[11],5 ) g_PlayerLevel[Player] = str_to_num(tStr[0]) g_PlayerMissionType[Player] = str_to_num(tStr[1]) g_PlayerMissionParams[Player][PARAM_PLAYER] = str_to_num(tStr[2]) g_PlayerMissionParams[Player][PARAM_CONST] = str_to_num(tStr[3]) g_PlayerMissionParams[Player][PARAM_WEAPON] = str_to_num(tStr[4]) g_PlayerMissionParams[Player][PARAM_HS] = str_to_num(tStr[5]) g_PlayerMissionParams[Player][PARAM_ROUND] = str_to_num(tStr[6]) g_PlayerMissionParams[Player][PARAM_SURVIVE] = str_to_num(tStr[7]) g_PlayerMissionParams[Player][PARAM_TIME] = str_to_num(tStr[8]) g_PlayerMissionParams[Player][PARAM_TIMEAMT] = str_to_num(tStr[9]) g_PlayerMissionParams[Player][PARAM_ROUNDTIMES] = str_to_num(tStr[10]) g_PlayerMissionParams[Player][PARAM_ROUNDTIME_COUNT] = str_to_num(tStr[11]) }
  12. Tu esi kekss, taču kodē saprotamāk, taisi atstarpes, netaisi jaunus globālos mainīgos koda vidū, mans method tev negāja, JO: PHP if(is_user_connected(i) || !is_user_bot(i) || !is_user_hltv(i)) >> PHP if(is_user_connected(i) && !is_user_bot(i) && !is_user_hltv(i)) Karoče, es nemeklēšu neko, ko optimizēt līdz tu neuzkodēsi visu smuki, lai var salasīt.
  13. Lēnāk izslēgsies!!! PHP new g_MaxPlayers = get_maxplayers() //or #define MAXPLAYERS 32 + 1 /* vai uzreiz 33, bet pluginā tas neko nemainaina, jo kompileram taisot pluginu visus defainus sabāž attiecīgajās vietās, un tā saskaitīšana notiek kompilējoties pluginam.*/ for(new i = 0; i < MAXPLAYERS; i++) {//vai g_MaxPlayers if(is_user_connected(i)) { //stuff } } Var optimizēd is_user_connected(i) pie konekta pielikt bitus un diskonektējoties izņemt(daudz labāk par arraju ar būliem), bet nu arī šādi nav nepareizi, un diezgan effektīgi.
  14. Salaidi lažu: 1. Nah global variable, bet nu labi, tā nav kļūda šajā gadījumā. 2. Nah for loop? 3. Nah return handled? 4. Nah tu loopā taisi katru reiz jaunu variable, tu zini kā tas ēd cpu, kur nu vēl izmantojot veco labu get_players. BAD. Mans variants(domāts, lai rmx saprastu savas kļūdas): PHP #include <amxmodx> #define VERSION "0.7.0" new c_IP public plugin_init() { register_plugin("Server Shutdown Redirect",VERSION,"shine") register_srvcmd("exit2","HookExit") c_IP = register_cvar("amx_shutdown_redirect_ip","shains.irkruts.lv:27015") } public HookExit() { new sIP[40] get_pcvar_string(c_IP,sIP,32) client_cmd(0,"connect %s",sIP) server_cmd("exit") } Server Console: exit2, un gatov. elvis: Par čatu - nē, man ir doma uztaisīt web live camera. Uztaisīt tā, ka webā caur kādu java aplikāciju var redzēt visu, kas notiek iekš game, caur noteiktu kameru vai ko tamlīdzīgu, bet es nedomāju uzsākt lielus projektus, kur ir nepieciešamas citas programmēšanas valodas zināšanas neskaitot Pawn. Par tiem warn es pašlaik nevaru īsti saprast, bet man liekas, ka kaut kur jau tāds ir, pameklē allied modders forumā, ne tikai amxmodx.org. Taisu pa laikam kādus modus, pēdējie: 1 un 2. Remix: Neaizmirsīšu, man ir doma par the last stand modu, kas būtu ~1000 - 2000 rindiņas, pa 2 nedēļām tiksim galā! Iemācīsies pareizi kodēt kaut cik . Šeit ir topiks, kur arkshine sola uzmeikot moduli monster AI, kas samazinās NPC lagus.
  15. Tas bija domāts uz quote, nevis uz šo kodu, bet anyway. Mēģinam vēlreiz? .
  16. Pēc quit ierakstīšanas visi tiek izkikoti un tad tiek izsaukts vienīgais forwards, kas ziņo par servera izslēgšanu/changemap. Nohūkojot changelevel un end, izveidojot būlu un čekojot būlu var kaut ko izdarīt, kad serveri izslēdz, bet spēlētājus izkiko pirms plugin_end tiek izsaukts, tātad tas nav iespējams. Remix, to varētu panākt ar šo: PHP #include <amxmodx> #define VERSION "0.7.0" new bool:g_ChangeLevel new c_IP public plugin_init() { register_plugin("Server Shutdown Redirect",VERSION,"shine") c_IP = register_cvar("amx_shutdown_redirect_ip","0.0.0.0:27015") } public server_changelevel(Map[]) g_ChangeLevel = true public plugin_end() { if(!g_ChangeLevel) { new sIP[40] get_pcvar_string(c_IP,sIP,32) client_cmd(0,"connect %s",sIP) } } Diemžēl, plugin_end tiek izsaukts, kad visi spēlētāji jau ir izkikoti. Kā jau teicu, tas nav iespējams, pat serveri izslēdzot ar "exit" komandu, kur nu vēl crash, kura gadījumā netiek neviens forwards izsaukts. Augstāk esošais paraugs nestrādā. Izlasiet visu, ko esmu uzrakstījis. Tāpēc arī mums ar to zombie survival nekas nesanāca .
  17. Tāds projekts sen vairs nav. Tu pluginu nemāki atrast, un vēlies šeit piedalīties?
  18. Ne visi, nahuj jums rakt vecu topiku augšā? Tas čalis ir sen pazudis un nekas tur tā arī nebija.
  19. Stulbeni, ja tev būtu kaut kripatiņas smadzeņu tu te neprasītu palīdzību. Problēmas nokompilēt pluginu, vai tomēr nomainīt source failā rindiņu? Esmu smags gadījums? Domāju, ka man visu sacītp vajadzētu tagad pārfrāzēt 3 reizes, lai tāds pokemons, kas sigā liek kaut kādas mazas, priecīgas nindzas saprastu. Atvaino, bet nebrauc virsū cilvēkiem, kam ir vairāk smadzeņu nekā pašam. Nomaini source failā rindiņu, nokompilē. Aizsvilos, jo sen neesmu gignā bijis. EDIT: Immortal sīks pidriks . EDIT2: Atvainojos visiem par savu ļoti nepieklājīgo uzvedību.
  20. Tu gribi nobanot ar xban caur amxbaniem un caur addip? Jēga?
  21. Ak dievs, tas ir strings, viss, kas atrodas starp pēdiņām ir 100% pareizs, kur ir problēma? Nu izņemot ^, kas tiek lietots, lai amxx stringos insertotu doublequotes. EDIT: Ar to es domāju, ka kompilēsies bez erroriem vai warningiem.
×
×
  • Create New...