Skocz do zawartości

Rekomendowane odpowiedzi

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:

 

level progress.png

 

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

 

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
  • Lubię to! 1

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 image.png.207cea14911805f1c00aa52889972efb.png 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 przez Shadow

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
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 image.png.207cea14911805f1c00aa52889972efb.png
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}

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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ą

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

HS nie poprawiałem. Jeśli zrobisz tak, jak mówi @Yamakashi będzie dobrze

W SQLite nie musisz dodawać niczego do konfiguracji

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


×
×
  • Dodaj nową pozycję...