MAGNET 8 2 Napisano 6 Sierpnia 2019 Trochę mi się nudziło, więc postanowiłem, że stworzę lekką wersję GunXpModa. Póki co mój czas włożony w ten plugin to jakieś 3 godziny, więc istnieje szansa, że coś może nie działać jak należy, ale nie mam jak sprawdzić czy na serwerze z graczami wszystko działa, bo...nie mam takiego serwera 😉. Nie jest to finalna wersja, bo chciałbym dowiedzieć się co przydało by się tutaj dodać. Propozycje poniżej 🙂 Opis Znana m.in. z serwerów BaseBuilder modyfikacja. Idea - odblokowujesz kolejne bronie zdobywając XP...w sumie nie ma tutaj nic więcej. Zapis: SQLite Ilość potrzebnego expa na kolejne poziomy jest wyrażona wzorem: Wzór: Exp(x) = (x**3 * (100-x))/20, gdzie x to level A tutaj wykres obrazujący ilość expa wymaganą na poszczególne poziomy: Komendy !gxp - otwiera menu moda Cvary cvWhenGiveWeapon = CreateConVar("gxp_when_give_weapon", "0", "Kiedy dawać broń? 0 - wraz z wyborem broni w menu, 1 - po odrodzeniu 2 - w fazie przygotowania (BaseBuilder)"); cvMinimalPlayers = CreateConVar("gxp_minimal_players", "2", "Od ilu graczy ma naliczać exp?"); cvKillExp = CreateConVar("gxp_kill_exp", "3", "Ilość punktów za zabójstwo"); cvHsExp = CreateConVar("gxp_hs_exp", "5", "Ilość punktów za zabójstwo z HS"); cvDeathExp = CreateConVar("gxp_death_exp", "1", "Ilość punktów za śmierć"); cvAssistExp = CreateConVar("gxp_assist_exp", "1", "Ilość punktów za asystę"); Kod Spoiler #include <sourcemod> #include <multicolors> #include <sdktools> #include <sdkhooks> #include <cstrike> #define LEVELS 27 #define TAG "{orchid}[GunXpMod]{default}" int playerExp[MAXPLAYERS]; int playerLevel[MAXPLAYERS]; int playerChosenWeapon[MAXPLAYERS]; int hudMode[MAXPLAYERS]; char weaponName[][] = { "Glock", "USP-S", "P250", "FiveSeven", "CZ75a", "Deagle", "Revolver", "Nova", "XM1014", "Mag7", "Sawedoff", "Mac10", "MP7", "MP9", "UMP45", "MP5-S", "P90", "PP-Bizon", "AK47", "M4A4", "M4A1-S", "SG556", "AUG", "SSG08", "AWP", "G3SG1", "SCAR20" }; char weaponTab[][] = { "weapon_glock", "weapon_usp_silencer", "weapon_p250", "weapon_fiveseven", "weapon_cz75a", "weapon_deagle", "weapon_revolver", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_mac10", "weapon_mp7", "weapon_mp9", "weapon_ump45", "weapon_mp5sd", "weapon_p90", "weapon_bizon", "weapon_ak47", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_sg556", "weapon_aug", "weapon_ssg08", "weapon_awp", "weapon_g3sg1", "weapon_scar20" }; char hudMsg[][] = { "HintText", "HUD", "Wyłączone" }; ConVar cvWhenGiveWeapon; ConVar cvMinimalPlayers; ConVar cvKillExp; ConVar cvHsExp; ConVar cvDeathExp; ConVar cvAssistExp; Database DB; bool dbConnected = false; Handle hud[MAXPLAYERS]; public Plugin myinfo = { name = "GunXpMod Lite", author = "MAGNET | YouTube: Koduj z Magnetem", description = "Odchudzona, czysta wersja GunXpMod", version = "0.1", url = "http://go-code.pl/" }; public void OnPluginStart() { cvWhenGiveWeapon = CreateConVar("gxp_when_give_weapon", "0", "Kiedy dawać broń? 0 - wraz z wyborem broni w menu, 1 - po odrodzeniu 2 - w fazie przygotowania (BaseBuilder)"); cvMinimalPlayers = CreateConVar("gxp_minimal_players", "2", "Od ilu graczy ma naliczać exp?"); cvKillExp = CreateConVar("gxp_kill_exp", "3", "Ilość punktów za zabójstwo"); cvHsExp = CreateConVar("gxp_hs_exp", "5", "Ilość punktów za zabójstwo z HS"); cvDeathExp = CreateConVar("gxp_death_exp", "1", "Ilość punktów za śmierć"); cvAssistExp = CreateConVar("gxp_assist_exp", "1", "Ilość punktów za asystę"); RegConsoleCmd("sm_gxp", MainMenu); HookEvent("player_death", SmiercGracza); HookEvent("player_spawn", OdrodzenieGracza); ConnectDB(); } public void OnClientDisconnect(int client) { SQL_Save(client); DeleteHudTask(client); } public void OnClientPutInServer(int client) { SQL_Load(client); } public void OnClientAuthorized(int client) { DeleteHudTask(client); } void DeleteHudTask(int client) { if (hud[client] != null) { KillTimer(hud[client]); hud[client] = null; } } public Action OdrodzenieGracza(Handle event, char[] name, bool dontbroadcast) { int client = GetClientOfUserId(GetEventInt(event, "userid")); if (!IsValidClient(client)) return Plugin_Continue; if (hud[client] == null) hud[client] = CreateTimer(0.5, PokazInformacje, client, TIMER_FLAG_NO_MAPCHANGE); return Plugin_Continue; } public Action PokazInformacje(Handle timer, int client) { hud[client] = CreateTimer(0.5, PokazInformacje, client, TIMER_FLAG_NO_MAPCHANGE); if (!IsValidClient(client) || hudMode[client] == 2) return; if (IsPlayerAlive(client)) { if (hudMode[client] == 0) PrintHud_Hint(client, client); else if (hudMode[client] == 1) PrintHud_Hud(client, client); } else { int spect = GetEntProp(client, Prop_Send, "m_iObserverMode"); if (spect == 4 || spect == 5) { int target = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget"); if (target != -1 && IsValidClient(target)) { if (hudMode[client] == 0) PrintHud_Hint(client, target); else if (hudMode[client] == 1) PrintHud_Hud(client, target); } } } } void PrintHud_Hint(int client, int target) { PrintHintText(client, "<font color='#AD42F4'>Level: %d</font><font color='#AD42F4'> [%d/%d]</font>", playerLevel[target], playerExp[target], GetLevelExp(playerLevel[target]+1)); } void PrintHud_Hud(int client, int target) { SetHudTextParamsEx(-1.0, 0.9, 0.6, { 255, 255, 0, 255 }); ShowHudText(client, 1, "Level: %d [%d/%d]", playerLevel[target], playerExp[target], GetLevelExp(playerLevel[target]+1)); } void SQL_Save(int client) { if (GetSteamAccountID(client) == 0) return; char query[1024]; Format(query, sizeof(query), "UPDATE `GunXpMod` SET `Name`='%N', `XP`=%d, `Level`=%d, `HudMode`=%d WHERE `SteamID`=%d", client, playerExp[client], playerLevel[client], hudMode[client], GetSteamAccountID(client)); DB.Query(CheckDBUpdate, query); } public void CheckDBUpdate(Database db, DBResultSet results, const char[] error, any data) { if (db == null) { LogMessage("Could not update player data! Error: %s", error); } } void SQL_Load(int client) { if (GetSteamAccountID(client) == 0) return; char query[1024]; Format(query, sizeof(query), "SELECT * FROM `GunXpMod` WHERE `SteamID`=%d", GetSteamAccountID(client)); DB.Query(CheckDBLoad, query, client); } public void CheckDBLoad(Database db, DBResultSet results, const char[] error, int client) { if (db == null || results == null) { LogMessage("Could not load player data! Error: %s", error); return; } if (results.RowCount == 0) { char query[1024]; Format(query, sizeof(query), "INSERT INTO `GunXpMod` VALUES(%d, '%N', 0, 0, 0)", GetSteamAccountID(client), client); DB.Query(CheckDBInsert, query); } else { while (results.FetchRow()) { playerExp[client] = results.FetchInt(2); playerLevel[client] = results.FetchInt(3); hudMode[client] = results.FetchInt(4); } } } public void CheckDBInsert(Database db, DBResultSet results, const char[] error, any data) { if (db == null) { LogMessage("Could not insert player data! Error: %s", error); } } void ConnectDB() { char sError[512]; DB = SQLite_UseDatabase("GunXpMod", sError, sizeof(sError)); if (DB == null) { LogMessage("Could not connect to the DataBase! Error: %s", sError); dbConnected = false; } else { dbConnected = true; char query[1024]; Format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `GunXpMod` (`SteamID` INTEGER NOT NULL UNIQUE,`Name` TEXT NOT NULL, `XP` INTEGER NOT NULL, `Level` INTEGER NOT NULL, `HudMode` INTEGER NOT NULL);"); DB.Query(CheckDB, query); } } public void CheckDB(Database db, DBResultSet results, const char[] error, any data) { if (db == null) { LogMessage("Could not create table! Error: %s", error); dbConnected = false; } } public void OnMapStart() { AutoExecConfig(true, "GunXpMod"); } public Action SmiercGracza(Handle event, char[] name, bool dontbroadcast) { if (PlayersCount() < cvMinimalPlayers.IntValue) return Plugin_Continue; int client = GetClientOfUserId(GetEventInt(event, "userid")); int killer = GetClientOfUserId(GetEventInt(event, "attacker")); int assister = GetClientOfUserId(GetEventInt(event, "assister")); bool headshot = GetEventBool(event, "headshot"); if (client == killer) return Plugin_Continue; playerExp[client] += cvDeathExp.IntValue; playerExp[assister] += cvAssistExp.IntValue; if (headshot) playerExp[killer] += cvHsExp.IntValue; else playerExp[killer] += cvKillExp.IntValue; CheckLevel(client); CheckLevel(killer); CheckLevel(assister); return Plugin_Continue; } void CheckLevel(int client) { if (playerLevel[client] >= LEVELS - 1) return; int requiredXP = GetLevelExp(playerLevel[client] + 1); if (playerExp[client] >= requiredXP) { playerLevel[client]++; CPrintToChat(client, "%s Osiągnięto poziom{lightgreen} %d!{lightred} [%s]", TAG, playerLevel[client], weaponName[playerLevel[client]]); } } public Action MainMenu(int client, int args) { if (dbConnected == false) { CPrintToChat(client, "%s Wystąpiły problemy z bazą danych. Poproś o pomoc administratora...", TAG); return Plugin_Continue; } Menu menu = new Menu(MainMenu_Handler); menu.SetTitle("GunXpMod by MAGNET"); menu.AddItem("guns", "Wybierz broń"); char buffer[256]; Format(buffer, sizeof(buffer), "Tryb HUD: %s", hudMsg[hudMode[client]]); menu.AddItem("hud", buffer); menu.Display(client, 120); return Plugin_Continue; } public int MainMenu_Handler(Menu menu, MenuAction action, int client, int item) { if (action == MenuAction_Select) { char InfoBuffer[32]; menu.GetItem(item, InfoBuffer, sizeof(InfoBuffer)); if (StrEqual(InfoBuffer, "guns")) { GunMenu(client); } else if (StrEqual(InfoBuffer, "hud")) { if (hudMode[client] == 2) hudMode[client] = 0; else hudMode[client]++; MainMenu(client, 0); } } } public void BaseBuilder_OnPrepTimeStart() { if (cvWhenGiveWeapon.IntValue != 2) return; for (int i = 1; i < MAXPLAYERS; i++) { if (!IsValidClient(i) || !IsPlayerAlive(i) || GetClientTeam(i) != CS_TEAM_CT) continue; GiveWeapon(i); } } void GunMenu(int client) { Menu menu = new Menu(GunMenu_Handler); char buffer[512]; Format(buffer, sizeof(buffer), "Twój poziom: %d(%d/%d EXP) [%s]", playerLevel[client], playerExp[client], GetLevelExp(playerLevel[client]+1), weaponName[playerLevel[client]]); char numBuffer[8]; menu.SetTitle(buffer); for (int i = 0; i < LEVELS; i++) { IntToString(i, numBuffer, sizeof(numBuffer)); Format(buffer, sizeof(buffer), "%s [%d EXP]", weaponName[i], GetLevelExp(i)); menu.AddItem(numBuffer, buffer, playerLevel[client] < i ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); } menu.Display(client, 120); } public int GunMenu_Handler(Menu menu, MenuAction action, int client, int item) { if (action == MenuAction_Select) { char InfoBuffer[32]; menu.GetItem(item, InfoBuffer, sizeof(InfoBuffer)); int option = StringToInt(InfoBuffer); PrintToChat(client, "Wybrano opcje: %d [%s]", option, weaponName[option]); playerChosenWeapon[client] = option; if (cvWhenGiveWeapon.IntValue == 0) GiveWeapon(client); } } void GiveWeapon(int client) { if (IsValidClient(client) && IsPlayerAlive(client)) { RemoveAllWeapons(client); GivePlayerItem(client, weaponTab[playerChosenWeapon[client]]); } } // Wzór: Exp(x) = (x**3 * (100-x))/20, gdzie x to level int GetLevelExp(int level) { if (level <= 0) return 0; float fLevel = float(level); float result = (Pow(fLevel, 3.0) * (100.0 - fLevel) / 20.0); int resultInt = RoundToCeil(result); // zaokraglam do czesci dziesietnych w gore (np. 4 -> 10, 307 -> 310 etc.) // jeśli exp powyżej tysiąca - do setnych if (resultInt >= 1000) return (resultInt / 100) * 100 + 100; return (resultInt / 10) * 10 + 10; } public bool IsValidClient(int client) { if (client >= 1 && client <= MaxClients && IsClientInGame(client)) return true; return false; } void RemoveAllWeapons(int client) { if (IsValidClient(client) && IsPlayerAlive(client)) { for (int i = 0; i < 4; i++) { int ent while ((ent = GetPlayerWeaponSlot(client, i)) != -1) { RemovePlayerItem(client, ent) AcceptEntityInput(ent, "Kill") } } GivePlayerItem(client, "weapon_knife") } } int PlayersCount() { int n = 0; for (int i = 1; i < MAXPLAYERS; i++) { if (IsValidClient(i) && !IsFakeClient(i)) n++; } return n; } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Shadow 1 Napisano 6 Sierpnia 2019 (edytowane) mam jeden problemik z kodem chyba nie jestem pewien z czym ale testuje sobie ale hmm nie pokazuje ile potrzeba expa do lvla dopiero przy osiągnięciu lvla pokazało, że mam 65/50 pkt chyba, że tak ma być hah :D tak samo z tym ale zapewne to coś mi brakuje zgaduje ale jak coś dam znać jeśli coś jeszcze znajde <3 EDIT:żeby zapisywało normalnie trzeba w database.cfg cos dać? bo przeczytałem ze jest SQLite i nie bardzo wiem czy trzeba coś dawać EDITx2: Wiem pewnie wkurzam ale tylko chce błędy zgłaszać więc tak expa za hs nie daje tylko tak jakby za samo zabicie Edytowane 6 Sierpnia 2019 przez Shadow Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 6 Sierpnia 2019 Wprowadziłem poprawke. Już powinno wyświetlać się poprawnie Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Paweł 1 Napisano 6 Sierpnia 2019 Spoiler if (headshot) playerExp[killer] += cvKillExp.IntValue; else playerExp[killer] += cvHsExp.IntValue; tutaj raczej powinno być: if (headshot) playerExp[killer] += cvHsExp.IntValue; else playerExp[killer] += cvKillExp.IntValue; Godzinę temu, Shadow napisał: tak samo z tym Hej! Skorzystałeś z linku lub pobrałeś załącznik? Uhonoruj naszą pracę poprzez rejestrację na forum i rośnij razem z nami! ale zapewne to coś mi brakuje zgaduje ale jak coś dam znać jeśli coś jeszcze znajde ❤️ Zamień w kodzie {lighred} na {lightred} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
Shadow Napisano 6 Sierpnia 2019 Za hs nadal dostaje się Xp'a jak za normalnego killa i da sie jakoś wszystko zresetować? bo testowałem jak z brońmi i np jak się odblokuje wszystki bronie a się chce wziąć ak-47 to bierze ci broń która jest "najwyżej" pod względem lvl'u czyli np bierzez ak a daje ci i tak awp bo awp maksymalnie masz odblokowaną Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 6 Sierpnia 2019 HS nie poprawiałem. Jeśli zrobisz tak, jak mówi @Yamakashi będzie dobrze W SQLite nie musisz dodawać niczego do konfiguracji Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach
MAGNET Napisano 7 Sierpnia 2019 10 godzin temu, Shadow napisał: da sie jakoś wszystko zresetować? bo testowałem jak z brońmi i np jak się odblokuje wszystki bronie a się chce wziąć ak-47 to bierze ci broń która jest "najwyżej" pod względem lvl'u czyli np bierzez ak a daje ci i tak awp bo awp maksymalnie masz odblokowaną To też był drobny bug w kodzie. Chyba już będzie działać. Poprawiłem również tego nieszczęsnego HSa xD Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach