Skocz do zawartości

Nowy szablon forum

mygo.pl

Stworzyliśmy dla Was nowy wygląd forum. Z pewnością znajdziesz rzeczy, które wg Ciebie mogą zostać zmienione - wspomnij o tym w specjalnym wątku.

Czytaj więcej

Jak założyć własną sieć

serwerów CS

Zastanawiasz się nad prowadzeniem własnej sieci serwerów? Przeczytaj podstawowe informacje, na które należy zwrócić uwagę, przy takim projekcie.

Czytaj więcej

Tworzymy spis sieci

dodaj swoją

Dodaj sieć do której należysz, pozwoli to na promocję i budowę ogólnopolskiej bazy sieci CS.

Czytaj więcej

simsen

Użytkownik
  • Postów

    12
  • Dołączył

  • Ostatnia wizyta

Ostatnie wizyty

Blok z ostatnimi odwiedzającymi dany profil jest wyłączony i nie jest wyświetlany użytkownikom.

Osiągnięcia simsen

Nowicjusz

Nowicjusz (1/14)

0

Reputacja

  1. simsen

    Mapy

    Wystarczy dodać ją do maplist.txt w folderze csgo, albo usunąć wszystkie mapy z tego pliku wtedy sourcemod robi listę automatycznie ze wszystkich które są w folderze maps
  2. Tutaj jest najnowsza działająca i aktualizowana wersja: https://github.com/Silenci0/UMC wystarczy dobrze skonfigurować i na pewno działa, bo używam na każdym serwerze.
  3. U mnie normalnie działa, ca prawda wystarczyło usunąć 2 linijki kodu odpowiadającego za game-me, więc nie psuje to działania pluginu, oczywiście jeżeli nie masz zamiaru używać gameme. Poniżej masz kod który użyłem do kompilacji, a w załącznikach include i sp, jeżeli nie uda ci się samemu to gotowy skompilowany smx. new 6.smxnew 6.sp #include <sourcemod> #include <sdkhooks> #include <sdktools> #include <cstrike> #include <clientprefs> #include <overlays> #undef REQUIRE_PLUGIN #include <kento_rankme/rankme> #include <gameme> #include <zr_rank> #include <hlstatsx_api> #define REQUIRE_PLUGIN #pragma newdecls required #pragma semicolon 1 int rank[MAXPLAYERS+1] = {0, ...}; int oldrank[MAXPLAYERS+1] = {0, ...}; // ConVar Variables ConVar g_CVAR_RanksPoints[18]; ConVar g_CVAR_RankPoints_Type; ConVar g_CVAR_RankPoints_Flag; ConVar g_CVAR_RankPoints_Prefix; ConVar g_CVAR_RankPoints_HudOverlay; ConVar g_CVAR_RankPoints_OverlayTime; ConVar g_CVAR_RankPoints_SoundEnable; ConVar g_CVAR_RankPoints_SoundRankUp; ConVar g_CVAR_RankPoints_SoundRankDown; // Variables to store ConVar values; int g_RankPoints_Type; int g_RankPoints_Flag; int g_RankPoints_HudOverlay; int g_RankPoints_SoundEnable; float g_RankPoints_OverlayTime; char g_RankPoints_SoundRankUp[PLATFORM_MAX_PATH]; char g_RankPoints_SoundRankDown[PLATFORM_MAX_PATH]; char g_RankPoints_Prefix[40]; int RankPoints[18]; bool g_zrank; bool g_kentorankme; bool g_gameme; bool g_hlstatsx; char RankStrings[19][256]; char RankOverlays[18][PLATFORM_MAX_PATH]; public Plugin myinfo = { name = "[CS:GO] Matchmaking Ranks by Points", author = "Hallucinogenic Troll", description = "Prints the Matchmaking Ranks on scoreboard, based on points stats by a certain rank.", version = "1.6", url = "https://PTFun.net/" }; public void OnPluginStart() { RegConsoleCmd("sm_mm", Menu_Points); HookEvent("announce_phase_end", Event_AnnouncePhaseEnd); HookEvent("player_death", Event_PlayerDeath); HookEvent("player_disconnect", Event_Disconnect, EventHookMode_Pre); // ConVar to check which rank you want g_CVAR_RankPoints_Type = CreateConVar("ranks_matchmaking_typeofrank", "0", "Type of Rank that you want to use for this plugin (0 for Kento Rankme, 1 for GameMe, 2 for ZR Rank, 3 for HLStatsX)", _, true, 0.0, true, 3.0); g_CVAR_RankPoints_Prefix = CreateConVar("ranks_matchmaking_prefix", "[{purple}Fake Ranks{default}]", "Chat Prefix"); g_CVAR_RankPoints_Flag = CreateConVar("ranks_matchmaking_flag", "", "Flag to restrict the ranks to certain players (leave it empty to enable for everyone)"); g_CVAR_RankPoints_HudOverlay = CreateConVar("ranks_matchmaking_hudoverlay" , "1", "Chooses between a HUD Text Message (0) or an Overlay (1)", _, true, 0.0, true, 1.0); g_CVAR_RankPoints_OverlayTime = CreateConVar("ranks_matchmaking_overlaytime", "5.0", "Time between showing and deleting the overlay (need \"ranks_matchmaking_hudoverlay\" set to 1). 0.0 means forever", _, true, 0.0, false); g_CVAR_RankPoints_SoundEnable = CreateConVar("ranks_matchmaking_soundenable", "1", "Enable sounds when a player ranks up or deranks", _, true, 0.0, true, 1.0); g_CVAR_RankPoints_SoundRankUp = CreateConVar("ranks_matchmaking_soundrankup", "levels_ranks/levelup.mp3", "Path to the sound which will play on Rank Up (needs \"ranks_matchmaking_soundenable\" set to 1)"); g_CVAR_RankPoints_SoundRankDown = CreateConVar("ranks_matchmaking_soundrankdown", "levels_ranks/leveldown.mp3", "Path to the sound which will play on Derank (needs \"ranks_matchmaking_soundenable\" set to 1)"); // Rank Points ConVars; g_CVAR_RanksPoints[0] = CreateConVar("ranks_matchmaking_point_s1", "1000", "Number of Points to reach Silver I", _, true, 0.0, false); g_CVAR_RanksPoints[1] = CreateConVar("ranks_matchmaking_point_s2", "1100", "Number of Points to reach Silver II", _, true, 0.0, false); g_CVAR_RanksPoints[2] = CreateConVar("ranks_matchmaking_point_s3", "1200", "Number of Points to reach Silver III", _, true, 0.0, false); g_CVAR_RanksPoints[3] = CreateConVar("ranks_matchmaking_point_s4", "1300", "Number of Points to reach Silver IV", _, true, 0.0, false); g_CVAR_RanksPoints[4] = CreateConVar("ranks_matchmaking_point_se", "1400", "Number of Points to reach Silver Elite", _, true, 0.0, false); g_CVAR_RanksPoints[5] = CreateConVar("ranks_matchmaking_point_sem", "1500", "Number of Points to reach Silver Elite Master", _, true, 0.0, false); g_CVAR_RanksPoints[6] = CreateConVar("ranks_matchmaking_point_g1", "1700", "Number of Points to reach Gold Nova I", _, true, 0.0, false); g_CVAR_RanksPoints[7] = CreateConVar("ranks_matchmaking_point_g2", "1900", "Number of Points to reach Gold Nova II", _, true, 0.0, false); g_CVAR_RanksPoints[8] = CreateConVar("ranks_matchmaking_point_g3", "2100", "Number of Points to reach Gold Nova III", _, true, 0.0, false); g_CVAR_RanksPoints[9] = CreateConVar("ranks_matchmaking_point_g4", "2300", "Number of Points to reach Gold Nova IV", _, true, 0.0, false); g_CVAR_RanksPoints[10] = CreateConVar("ranks_matchmaking_point_mg1", "2500", "Number of Points to reach Master Guardian I", _, true, 0.0, false); g_CVAR_RanksPoints[11] = CreateConVar("ranks_matchmaking_point_mg2", "2700", "Number of Points to reach Master Guardian II", _, true, 0.0, false); g_CVAR_RanksPoints[12] = CreateConVar("ranks_matchmaking_point_mge", "2900", "Number of Points to reach Master Guardian Elite", _, true, 0.0, false); g_CVAR_RanksPoints[13] = CreateConVar("ranks_matchmaking_point_dmg", "3100", "Number of Points to reach Distinguished Master Guardian", _, true, 0.0, false); g_CVAR_RanksPoints[14] = CreateConVar("ranks_matchmaking_point_le", "3300", "Number of Points to reach Legendary Eagle", _, true, 0.0, false); g_CVAR_RanksPoints[15] = CreateConVar("ranks_matchmaking_point_lem", "3500", "Number of Points to reach Legendary Eagle Master", _, true, 0.0, false); g_CVAR_RanksPoints[16] = CreateConVar("ranks_matchmaking_point_smfc", "3700", "Number of Points to reach Supreme Master First Class", _, true, 0.0, false); g_CVAR_RanksPoints[17] = CreateConVar("ranks_matchmaking_point_ge", "3900", "Number of Points to reach Global Elite", _, true, 0.0, false); LoadTranslations("ranks_matchmaking.phrases"); AutoExecConfig(true, "ranks_matchmaking"); } public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { MarkNativeAsOptional("ZR_Rank_GetPoints"); MarkNativeAsOptional("RankMe_OnPlayerLoaded"); MarkNativeAsOptional("RankMe_GetPoints"); MarkNativeAsOptional("QueryGameMEStats"); return APLRes_Success; } public void OnLibraryAdded(const char[] name) { if (StrEqual(name, "zr_rank")) { g_zrank = true; } else if (StrEqual(name, "rankme")) { g_kentorankme = true; } else if(StrEqual(name, "gameme")) { g_gameme = true; } else if (StrEqual(name, "hlstatsx_api")) { g_hlstatsx = true; } } public void OnLibraryRemoved(const char[] name) { if (StrEqual(name, "zr_rank")) { g_zrank = false; } else if(StrEqual(name, "rankme")) { g_kentorankme = false; } else if(StrEqual(name, "gameme")) { g_gameme = false; } else if (StrEqual(name, "hlstatsx_api")) { g_hlstatsx = false; } } public void OnMapStart() { for (int i = 0; i < 18; i++) RankPoints[i] = g_CVAR_RanksPoints[i].IntValue; g_RankPoints_HudOverlay = g_CVAR_RankPoints_HudOverlay.IntValue; g_RankPoints_OverlayTime = g_CVAR_RankPoints_OverlayTime.FloatValue; g_CVAR_RankPoints_Prefix.GetString(g_RankPoints_Prefix, sizeof(g_RankPoints_Prefix)); g_RankPoints_SoundEnable = g_CVAR_RankPoints_SoundEnable.IntValue; g_CVAR_RankPoints_SoundRankUp.GetString(g_RankPoints_SoundRankUp, sizeof(g_RankPoints_SoundRankUp)); g_CVAR_RankPoints_SoundRankDown.GetString(g_RankPoints_SoundRankDown, sizeof(g_RankPoints_SoundRankDown)); char buffer[10]; g_CVAR_RankPoints_Flag.GetString(buffer, sizeof(buffer)); if(StrEqual(buffer, "0") || strlen(buffer) < 1) g_RankPoints_Flag = -1; else g_RankPoints_Flag = ReadFlagString(buffer); g_RankPoints_Type = g_CVAR_RankPoints_Type.IntValue; int iIndex = FindEntityByClassname(MaxClients+1, "cs_player_manager"); if (iIndex == -1) SetFailState("Unable to find cs_player_manager entity"); SDKHook(iIndex, SDKHook_ThinkPost, Hook_OnThinkPost); GetRanksNames(); if(g_RankPoints_HudOverlay) GetRanksOverlays(); if(g_RankPoints_SoundEnable) GetRanksGradesSounds(); } public void GetRanksGradesSounds() { char buffer[PLATFORM_MAX_PATH]; Format(buffer, sizeof(buffer), "sound/%s", g_RankPoints_SoundRankUp); AddFileToDownloadsTable(buffer); Format(buffer, sizeof(buffer), "*/%s", g_RankPoints_SoundRankUp); FakePrecacheSound(buffer); Format(buffer, sizeof(buffer), "sound/%s", g_RankPoints_SoundRankDown); AddFileToDownloadsTable(buffer); Format(buffer, sizeof(buffer), "*/%s", g_RankPoints_SoundRankDown); FakePrecacheSound(buffer); } public void GetRanksOverlays() { for(int i = 0; i < 18; i++) { Format(RankOverlays[i], sizeof(RankOverlays[]), "lvl_overlays/overlay_hd_%d", (i+1)); PrecacheDecalAnyDownload(RankOverlays[i]); } } public void GetRanksNames() { FormatEx(RankStrings[0], sizeof(RankStrings[]), "%t", "Unranked"); FormatEx(RankStrings[1], sizeof(RankStrings[]), "%t", "Silver I"); FormatEx(RankStrings[2], sizeof(RankStrings[]), "%t", "Silver II"); FormatEx(RankStrings[3], sizeof(RankStrings[]), "%t", "Silver III"); FormatEx(RankStrings[4], sizeof(RankStrings[]), "%t", "Silver IV"); FormatEx(RankStrings[5], sizeof(RankStrings[]), "%t", "Silver Elite"); FormatEx(RankStrings[6], sizeof(RankStrings[]), "%t", "Silver Elite Master"); FormatEx(RankStrings[7], sizeof(RankStrings[]), "%t", "Gold Nova I"); FormatEx(RankStrings[8], sizeof(RankStrings[]), "%t", "Gold Nova II"); FormatEx(RankStrings[9], sizeof(RankStrings[]), "%t", "Gold Nova III"); FormatEx(RankStrings[10], sizeof(RankStrings[]), "%t", "Gold Nova Master"); FormatEx(RankStrings[11], sizeof(RankStrings[]), "%t", "Master Guardian I"); FormatEx(RankStrings[12], sizeof(RankStrings[]), "%t", "Master Guardian II"); FormatEx(RankStrings[13], sizeof(RankStrings[]), "%t", "Master Guardian Elite"); FormatEx(RankStrings[14], sizeof(RankStrings[]), "%t", "Distinguished Master Guardian"); FormatEx(RankStrings[15], sizeof(RankStrings[]), "%t", "Legendary Eagle"); FormatEx(RankStrings[16], sizeof(RankStrings[]), "%t", "Legendary Eagle Master"); FormatEx(RankStrings[17], sizeof(RankStrings[]), "%t", "Supreme First Master Class"); FormatEx(RankStrings[18], sizeof(RankStrings[]), "%t", "Global Elite"); } public Action RankMe_OnPlayerLoaded(int client) { if(g_kentorankme && g_RankPoints_Type == 0) { int points = RankMe_GetPoints(client); CheckRanks(client, points); } } public void OnClientPostAdminCheck(int client) { if (IsValidClient(client)) { if (g_gameme && g_RankPoints_Type == 1) { } else if (g_zrank && g_RankPoints_Type == 2) { int points = ZR_Rank_GetPoints(client); CheckRanks(client, points); } else if (g_hlstatsx && g_RankPoints_Type == 3) { HLStatsX_Api_GetStats("playerinfo", client, _HLStatsX_API_Response, 0); } } } public int QuerygameMEStatsCallback(int command, int payload, int client, Handle &datapack) { if ((client > 0) && (command == RAW_MESSAGE_CALLBACK_PLAYER)) { Handle data2 = CloneHandle(datapack); ResetPack(data2); int points; points = ReadPackCell(data2); points = ReadPackCell(data2); points = ReadPackCell(data2); CloseHandle(data2); CheckRanks(client, points); } } public void _HLStatsX_API_Response(int command, int payload, int client, DataPack &datapack) { if (!IsValidClient(client) || command != HLX_CALLBACK_TYPE_PLAYER_INFO) { return; } DataPack pack = view_as<DataPack>(CloneHandle(datapack)); int points; points = pack.ReadCell(); points = pack.ReadCell(); delete datapack; delete pack; CheckRanks(client, points); } public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) { int victim = GetClientOfUserId(event.GetInt("userid")); if(IsValidClient(victim)) CheckPoints(victim); int attacker = GetClientOfUserId(event.GetInt("attacker")); if(IsValidClient(attacker)) CheckPoints(attacker); int assister = GetClientOfUserId(event.GetInt("assister")); if(IsValidClient(assister)) CheckPoints(assister); } public Action Event_Disconnect(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); if(client) rank[client] = 0; } public void CheckPoints(int client) { if (g_kentorankme && g_RankPoints_Type == 0) { int points = RankMe_GetPoints(client); CheckRanks(client, points); } else if (g_gameme && g_RankPoints_Type == 1) { } else if (g_zrank && g_RankPoints_Type == 2) { int points = ZR_Rank_GetPoints(client); CheckRanks(client, points); } else if (g_hlstatsx && g_RankPoints_Type == 3) { HLStatsX_Api_GetStats("playerinfo", client, _HLStatsX_API_Response, 0); } } public void CheckRanks(int client, int points) { if(g_RankPoints_Flag != -1) { if(!CheckCommandAccess(client, "", g_RankPoints_Flag, true)) { rank[client] = 0; return; } } // Unranked if(points < RankPoints[0]) rank[client] = 0; else if(points >= RankPoints[0] && points < RankPoints[1]) // Silver I rank[client] = 1; else if(points >= RankPoints[1] && points < RankPoints[2]) // Silver II rank[client] = 2; else if(points >= RankPoints[2] && points < RankPoints[3]) // Silver III rank[client] = 3; else if(points >= RankPoints[3] && points < RankPoints[4]) // Silver IV rank[client] = 4; else if(points >= RankPoints[4] && points < RankPoints[5]) // Silver Elite rank[client] = 5; else if(points >= RankPoints[5] && points < RankPoints[6]) // Silver Elite Master rank[client] = 6; else if(points >= RankPoints[6] && points < RankPoints[7]) // Gold Nova I rank[client] = 7; else if(points >= RankPoints[7] && points < RankPoints[8]) // Gold Nova II rank[client] = 8; else if(points >= RankPoints[8] && points < RankPoints[9]) // Gold Nova III rank[client] = 9; else if(points >= RankPoints[9] && points < RankPoints[10]) // Gold Nova Master rank[client] = 10; else if(points >= RankPoints[10] && points < RankPoints[11]) // Master Guardian I rank[client] = 11; else if(points >= RankPoints[11] && points < RankPoints[12]) // Master Guardian II rank[client] = 12; else if(points >= RankPoints[12] && points < RankPoints[13]) // Master Guardian Elite rank[client] = 13; else if(points >= RankPoints[13] && points < RankPoints[14]) // Distinguished Master Guardian rank[client] = 14; else if(points >= RankPoints[14] && points < RankPoints[15]) // Legendary Eagle rank[client] = 15; else if(points >= RankPoints[15] && points < RankPoints[16]) // Legendary Eagle Master rank[client] = 16; else if(points >= RankPoints[16] && points < RankPoints[17]) // Supreme Master First Class rank[client] = 17; else if(points >= RankPoints[17]) // Global Elite rank[client] = 18; if(rank[client] > oldrank[client] && rank[client] > 0) { switch(g_RankPoints_HudOverlay) { case 0: { SetHudTextParams(-1.0, 0.125, 5.0, 255, 255, 255, 255, 0, 0.25, 1.5, 0.5); ShowHudText(client, 5, "%t", "Rank Up", RankStrings[rank[client]]); } case 1: { ShowOverlay(client, RankOverlays[rank[client] - 1], g_RankPoints_OverlayTime); } } if(g_RankPoints_SoundEnable) { ClientCommand(client, "playgamesound Music.StopAllMusic"); EmitSoundToClient(client, g_RankPoints_SoundRankUp, SOUND_FROM_PLAYER, SNDCHAN_STATIC, SNDLEVEL_NONE, _, 0.75); } } if(rank[client] < oldrank[client] && rank[client] > 0) { switch(g_RankPoints_HudOverlay) { case 0: { SetHudTextParams(-1.0, 0.125, 5.0, 255, 255, 255, 255, 0, 0.25, 1.5, 0.5); ShowHudText(client, 5, "%t", "Rank Down", RankStrings[rank[client]]); } case 1: { ShowOverlay(client, RankOverlays[rank[client] - 1], g_RankPoints_OverlayTime); } } if(g_RankPoints_SoundEnable) { ClientCommand(client, "playgamesound Music.StopAllMusic"); EmitSoundToClient(client, g_RankPoints_SoundRankDown, SOUND_FROM_PLAYER, SNDCHAN_STATIC, SNDLEVEL_NONE, _, 0.75); } } oldrank[client] = rank[client]; } public void Hook_OnThinkPost(int iEnt) { static int iRankOffset = -1; if (iRankOffset == -1) iRankOffset = FindSendPropInfo("CCSPlayerResource", "m_iCompetitiveRanking"); int iRank[MAXPLAYERS+1]; for (int i = 1; i <= MaxClients; i++) { if(IsValidClient(i)) { iRank[i] = rank[i]; SetEntDataArray(iEnt, iRankOffset, iRank, MaxClients+1); } } } public Action Menu_Points(int client, int args) { Menu menu = new Menu(Panel_Handler); char buffer[256]; Format(buffer, sizeof(buffer), "%t", "Rank Menu Title"); menu.SetTitle(buffer); Format(buffer, sizeof(buffer), "%t", "Less Than X Points", RankStrings[0], (RankPoints[0] - 1)); menu.AddItem("1", buffer); char S_i[2]; for(int i = 1; i < 17; i++) { IntToString(i, S_i, sizeof(S_i)); Format(buffer, sizeof(buffer), "%t", "Between X and Y", RankStrings[i], RankPoints[i - 1], (RankPoints[i + 1] - 1)); menu.AddItem(S_i, buffer); } Format(buffer, sizeof(buffer), "%t", "More Than X Points", RankStrings[18], (RankPoints[17] - 1)); menu.AddItem("17", buffer); menu.ExitButton = true; menu.Display(client, 20); } public int Panel_Handler(Menu menu, MenuAction action, int client, int choice) { if(action == MenuAction_Select) { } else if (action == MenuAction_End) { delete menu; } } public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) { if (buttons & IN_SCORE && !(GetEntProp(client, Prop_Data, "m_nOldButtons") & IN_SCORE)) { Handle hBuffer = StartMessageOne("ServerRankRevealAll", client); if (hBuffer == INVALID_HANDLE) PrintToChat(client, "INVALID_HANDLE"); else EndMessage(); } return Plugin_Continue; } public Action Event_AnnouncePhaseEnd(Handle event, const char[] name, bool dontBroadcast) { Handle hBuffer = StartMessageAll("ServerRankRevealAll"); if (hBuffer == INVALID_HANDLE) PrintToServer("ServerRankRevealAll = INVALID_HANDLE"); else EndMessage(); return Plugin_Continue; } stock bool IsValidClient(int client) { if(client >= 1 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client)) return true; return false; } // https://wiki.alliedmods.net/Csgo_quirks stock void FakePrecacheSound(const char[] szPath) { AddToStringTable(FindStringTable("soundprecache"), szPath); } gameme.inc zr_rank.inc hlstatsx_api.inc
  4. Właśnie nie chodzi mi o same mapy, tylko po prostu chciałem zrobić tak żeby wszystko się pobierało z workshopa
  5. Witam, wiecie może jak skonfigurować Ultimate Map Chooser, żeby współpracował z workshopem? Próbowałem normalnie do umc_mapcycle dodać zamiast nazwy całą ścieżkę "workshop/id/mapa", ale plugin nie wykrywał wtedy zupełnie mapy.
  6. W error logach nic nie masz ?
  7. Ciekawe że go używam i od miesiąca i nie dostałem ani jednego bana, ale dobra widzę że lepiej się znacie...
  8. Ja też polecam migracje do innej firmy to odcinanie od steam'a wykończyło kiedyś serwery na których maiłem admina...
  9. Darmowego nie ma jednak polecam na pisać do franuga za 120zł masz najnowsze kosy z aktualizacjami + antyban'a i nie musisz zmieniać tokenów.
  10. W csgo>addons>sourcemod>config>core.cfg zmieniasz FollowValveServerGuildlines czy coś takiego na samym dole z yes na no i po restarcie serwera powinno zadziałać.
  11. No nie do końca, bo większość tych stron nie oferuje porządnego anty-ddos'a i procesów z odpowiednim taktowaniem rdzenia, a to właśnie jest potrzebne do cs'a... Osobiście polecam https://www.sprintdatacenter.pl pakiety z procesorami v3, korzystam od jakiś 5 miesięcy i jeszcze nie miałem problemów.
  12. Opis: Potrzebuje api dotpay do przelewów i smsów dla sklepu sms by seek http://sklep-sms.pl Cena: do ustalenia Płatność: przelewem lub paypalem. Kontakt steam: http://steamcommunity.com/id/simsenn/
×
×
  • Dodaj nową pozycję...