Ktoś pewnie spojrzy zaraz tutaj i pomyśli sobie, że napisanie takiego skryptu nie jest możliwe, bo gra nie ma nawet zmiennej, której przypisywany byłby stan portfela, a co dopiero mówić o możliwości wywoływania takiej zmiennej do say'a. I będzie miał rację. To nie jest skrypt. A przynajmniej w dużej części nie.

CSMoneyReporter to osobny program, niezależny od samej gry plik „.exe”, który przetwarza tej gry komunikaty debuggingowe i wynik swojej pracy zapisuje w pliku „.cfg”, który następnie możemy z poziomu CS-a już sobie wywołać. I dzięki temu wciskając potem tylko jeden przycisk (do wczytania tego konfiga, co to go program stworzył), raportujemy współbraciom z drużyny precyzyjnie stan naszego portfela.
Autor możliwościami, jakie z powstania takiego programy wyniknęły, trochę się jeszcze pobawił i rozbudował swe dzieło o różne zmyślne komentarze - wysyłane zależnie od sytuacji razem z liczbowym stanem portfela. Domyślnie wygląda to tak:
.png)
.png)
.png)
W dalszej części wytłumaczę, jak to sobie ładnie można na polski przetłumaczyć lub jak się tych komentarzy (obok suchych danych liczbowych) pozbyć zupełnie. Ale najpierw inna rzecz - żeby był jakiś porządek
.
Instalacja - pliki
Aby program zainstalować, wpierw musimy go sobie pobrać.
- CSMoneyReporter 1.0,
- CSMoneyReporter 1.0 - source code (kod źródłowy programu - wymaga bibliotek „Lua”),
Potrzebujemy oczywiście tylko głównego pliku zip („CSMoneyReporter.zip”). Kod źródłowy („CSMoneyReporter_src.zip”) to materiał jedynie dla programistów, ciekawych jak to wszystko działa od strony technicznej i jak zostało napisane - linka umieszczam jedynie w celach archiwizatorskich
. Gdy już archiwum zip szczęśliwie znajdzie się na naszym dysku, należy je gdzieś sobie rozpakować, a następnie skopiować pliki „config.lua”, „CSMoneyReporter.exe”, „CSMoneyReporter.lua” do- katalogu „/cstrike” w przypadku używania non-steama lub steama w wersji oryginalnej (angielskiej),
- lub „/cstrike_język” - gdzie „_język” to oczywiście nasza wersja jezykowa steama, np. „/cstrike_polish” - w przypadku instalacji pod steama w wersji przetłumaczonej.
W drugim przypadku konieczna będzie także zmiana wartości zmiennej „cstrikeFolderName” w pliku konfiguracyjnym „config.lua” z „cstrike” na „cstrike_język”, gdzie „_język” oczywiście znaczenie ma jak powyżej. Więcej o „config.lua” piszę w „Konfiguracja - ogólnie” oraz w „Konfiguracja - tłumaczenie”, w tej drugiej sekcji też także wklejam go w całości.
Instalacja - komendy w grze
Aby móc z zainstalowanego już programu korzystać, trzeba sobie także w grze odwołanie do jego funkcji zbindować. Generalnie komendy są dwie i można to zrobić np. tak:
Code:
bind "," "echo CSMoneyReporter; wait; wait; wait; exec moneyreport.cfg"
bind "." "echo CSMoneyReporterWeapon; wait; wait; wait; exec moneyreport.cfg"
U mnie to przecinek i kropka, bo samo menu kupowania ustawione mam pod „M”. Obie te komendy nie są nam niezbędne - wystarczy tylko ta pierwsza, pod jednym wtedy już przyciskiem. I w takim przypadku można gdzieś to ładniej upchnąć np. pod „P” (jak „portfel”
). Wiem, że wiele osób kropką i przecinkiem kupuje CS-ową amunicję, i nie bardzo by im się taki układ widział.
CSMoneyReporter nie wykrywa tego, czy mamy broń (karabin) czy nie. Dlatego są dwa bindy domyślnie - i wciskamy je zależnie od tego, co mamy na stanie albo po prostu co chcemy powiedzieć. No bo przecież można też współbraci z drużyny blefować
.
Uruchamianie
Aby program teraz zadziałał, należy po prostu włączyć jego główny plik wykonywalny („CSMoneyReporter.exe”) razem z grą. Przed czy po, nie ma znaczenia. I gdy już „.exe” pracuje nam w tle, to wciskamy sobie klawisze, które wcześniej zbindowaliśmy. Raportować stan portfela na say'u można w każdym momencie rundy, nie tylko na samym jej początku - program działa cały czas.
Podstawowe czynności właściwie tutaj się kończą - po wykonaniu powyższych trzech kroków będziemy mieli sprawnego już CSMoneyReportera, pracującego dla nas w domyślnej konfiguracji. Warto jednak, myślę, zagłębić się w to bardziej i trochę tę konfigurację usprawnić. Zwłaszcza, że nie kosztuje to dużo wysiłku.
Konfiguracja - tłumaczenie
Na konfigurację programu składają się dwa pliki tekstowe, „config.lua”:
Code:
-- CSMoneyReporter configuration file
-- Name of your cstrike folder. You might change it, if your Steam is not in English!
cstrikeFolderName = "cstrike"
-- Cfg file in your cstrike folder
cfgFileName = "moneyreport.cfg"
-- Default money message
-- Used, when dynamic messages disabled
-- NOTE: {CURRENTMONEY} gonna be replaced with your current in-game money
reportMoneyMessage = "I got ${CURRENTMONEY}!"
-- Enable dynamic messages
enableDynamicMessages = true
-- Limits for dynamic messages
poorLimit = 2000
richLimit = 10000
-- Dynamic messages
-- You can add more, if you want to
-- Note: {CURRENTMONEY} will be replaced with your current money
MessageAdd("${CURRENTMONEY} > I'm fine")
PoorMessageAdd("${CURRENTMONEY} > DROP!")
RichMessageAdd("${CURRENTMONEY} > Need something?")
-- End Of File oraz „CSMoneyReporter.lua”:
Code:
-- CSMoneyReporter commands:
-- GetCSMRVersion()
-- GetGamePID()
-- GetGameDirectory(GamePID)
-- GetScoreCT(GamePID)
-- GetScoreT(GamePID)
-- GetCurrentMoney(GamePID)
-- Initialize variables
local CSMR = {}
local Game = {}
CSMR.Version = GetCSMRVersion()
Game.Path = nil
Game.PID = nil
-- Dynamic messages
local Report = {}
Report.Limit = {}
Report.Messages = {}
Report.Messages.Poor = {}
Report.Messages.Rich = {}
-- Add message to a specified table
function PoorMessageAdd(message)
table.insert(Report.Messages.Poor, message)
end
function RichMessageAdd(message)
table.insert(Report.Messages.Rich, message)
end
function MessageAdd(message)
table.insert(Report.Messages, message)
end
-- Title
print("CSMoneyReporter started!")
print("version: " .. CSMR.Version .. "\n")
-- Load configuration
dofile("config.lua")
Report.Limit.Poor = poorLimit
Report.Limit.Rich = richLimit
-- Make sure game is running
Game.PID = GetGamePID()
if not Game.PID then
print("Error:\tCounter-Strike not found!\n\tStart the game first!")
--os.exit()
return
end
Game.Path = GetGameDirectory(Game.PID)
if not Game.Path then
print("Error:\tCounter-Strike not found!\n\tStart the game first!")
--os.exit()
return
end
-- Remove trailing slashes
if (cstrikeFolderName:sub(-1, -1) == "\\") then
cstrikeFolderName = cstrikeFolderName:sub(1, -2)
end
-- Done
-- Report current money
function ReportCurrentMoney(hasWeapon)
local currentMoney = GetCurrentMoney(Game.PID)
local cfgFullPath = Game.Path .. "\\" .. cstrikeFolderName .. "\\" .. cfgFileName
local message = nil
if enableDynamicMessages then
if currentMoney < Report.Limit.Poor then
message = Report.Messages.Poor[math.random(#Report.Messages.Poor)]
elseif currentMoney > Report.Limit.Rich then
message = Report.Messages.Rich[math.random(#Report.Messages.Rich)]
else
message = Report.Messages[math.random(#Report.Messages)]
end
else
message = reportMoneyMessage
end
if hasWeapon then
message = message:gsub("{CURRENTMONEY}", tostring(currentMoney) .. " + weapon")
else
message = message:gsub("{CURRENTMONEY}", tostring(currentMoney))
end
local cfgFileHanle = io.open(cfgFullPath, "w+")
cfgFileHanle:write("say_team \"" .. message .. "\"")
io.close(cfgFileHanle)
print("Money reported: " .. message)
end
-- OnMessage callback
function OnMessage(pID, message)
-- it is a game message?
if (pID == Game.PID) then
local match = nil
--[[ test here
if (message == "CSDemoArchiverTEST") then
print("weee")
end
--]]
if (message == "CSMoneyReporter") then
ReportCurrentMoney()
return
end
if (message == "CSMoneyReporterWeapon") then
ReportCurrentMoney(true)
return
end
-- show uncatched messages
--print("MSG: " .. message)
end
end Oba bez przeszkód edytować można np. windowsowym notatnikiem. Aby program przetłumaczyć lub po prostu jego komunikaty sobie spersonalizować, wystarczy zająć się jedynie pięcioma linijkami tekstu:- lin. 12. z „config.lua”:
Code:
reportMoneyMessage = "I got ${CURRENTMONEY}!" - lin 24., 25. i 26 z „config.lua”:
Code:
MessageAdd("${CURRENTMONEY} > I'm fine")
PoorMessageAdd("${CURRENTMONEY} > DROP!")
RichMessageAdd("${CURRENTMONEY} > Need something?") - oraz lin. 90. z „CSMoneyReporter.lua” (wyraz „weapon”, czyli „broń”):
Code:
message = message:gsub("{CURRENTMONEY}", tostring(currentMoney) .. " + weapon")
W każdym z przypadków edytować możemy sobie wszystko, co znajduje się w tych podwójnych nawiasach - czyli np. nie tylko „Need something?”, ale także znak „>” i nie tylko frazę „weapon”, ale także poprzedzającego ją plusa. Myślę, że to dość oczywiste i wynika z samej struktury tego, co tam w tych plikach jest napisane
.
Ale tłumaczyć wcale nie trzeba, bo można to wszystko zrobić jeszcze lepiej i znacznie prościej
. Zupełnie bezjęzykowo i bezosobowo
.
Konfiguracja - praktyczna rada 
A może by tak po prostu pisać samą kasę? A no, można. Wystarczy:- w pliku „config.lua” w lin. 15. zmienić wartość zmiennej „enableDynamicMessages” z „true” na „false”,
- a jeszcze wcześniej, w lin. 12. usunąć „I got ” z „I got ${CURRENTMONEY}!”, czyli domyślnej wartości zmiennej „reportMoneyMessage”.
I potem kasę raportujemy po prostu bindem Code:
bind "," "echo CSMoneyReporter; wait; wait; wait; exec moneyreport.cfg"
I już, i tyle. Nic więcej robić ani wiedzieć nie musimy
.
Konfiguracja - ogólnie
Gdybyśmy jednak chcieli sobie pokonfigurować, to np. wspomniana przeze mnie wcześniej zmienna „enableDynamicMessages” („config.lua”) włącza lub wyłącza tzw. komunikaty dynamiczne, czyli to, iż na say'u pisać będziemy różne teksty - zależnie od tego, czy mamy duży kasy (i możemy podzielić się z kimś bronią) czy mało (i chcemy, by ktoś z nami podzielił się bronią). Normalnie mamy tu trzy stany:- „Poor” - gdy stan naszej kasy to mniej niż 2000,
- „Rich” - gdy pieniędzy mamy jak miodu, tj. pow. 10000,
- i „Normal” - dla wartości stanu portfela między tymi wartościami, tj. od 2 do 10 tys.
Przedziały te także możemy regulować, zmieniając wartości zmiennych „poorLimit” i „richLimit” w pliku „config.lua”.
A jeśli nadal spragnieni jesteście wiedzy, to zapraszam na:
Małe F.A.Q. 
- Czy programu używać można w tych wszystkich śmiesznych ligach i czy będzie on działał w zgodnie z tych lig jeszcze śmieszniejszymi regulaminami?
Autor działa twierdzi, że tak. A ja tam nie wiem, może po prostu go zacytuję:
It should be safe, since it does not modify any game related data, only reads game directory path and your current money, but some poorly written anti-cheat software might alert if you use it. I take no responsibility for any damage.
- Program nie uruchamia się. Wyskakuje mi jakiś komunikat, że brakuje pliku „msvcp100.dll”.
CSMoneyReporter do pracy wymaga takich tam plików od Microsoftu - muszą być one dostepne w systemie. Ściągnij sobie i zainstaluj „Microsoft Visual C++ 2010 Redistributable Package”. - Mam 1280 growych pieniędzy oraz broń za pazuchą, a nie chcę pisać „$1280 + weapon > DROP!”, no bo to głupie - wcale żadnej broni nie potrzebuję. A taki właśnie komunikat chce wysyłać program, gdy wciskam binda z „echo CSMoneyReporterWeapon”, no bo, wiadomo, mam mało kasy (poniżej wartości „poorLimit”). Co zrobić, żeby jeśli mam broń (karabin), nigdy w komunikacie nie pojawiało mi się „DROP” - niezależnie od stanu mojego growego portfela?
W pliku „CSMoneyReporter.lua” musisz edytować lin. 78. z: Code:
if currentMoney < Report.Limit.Poor then
na Code:
if (currentMoney < Report.Limit.Poor) and (not hasWeapon) then
Swoją drogą, dziwne iż sam autor programu tego nie ustawił w ten sposób.
Wszystko to w największym skrócie 
A to tak o
, gdyby komuś nie chciało się wnikać i akurat nie miał żadnych problemów technicznych. Ściągasz zi0m ten główny plik zip („CSMoneyReporter.zip”), wrzucasz te trzy pliczki, co tam są w środku do „/cstrike” (jeśli nie działa, poczytaj więcej w sekcji „Instalacja - pliki”), ustawiasz to wszystko jak w „Konfiguracja - praktyczna rada”, walisz to w konfig:
Code:
bind "p" "echo CSMoneyReporter; wait; wait; wait; exec moneyreport.cfg"
włączasz grę, włączasz program („CSMoneyReporter.exe”) i wciskasz klawisz „P” na początku rundy. I raczej zadziała
. A jak nie, to czytaj zi0m, analizuj te pliczki albo zapytaj po prostu. Jak zwykle, forum uprzejmie służy wszystkim pomocą
.