+ Reply to Thread
Results 1 to 7 of 7

Thread: Raportuj stan growego portfela jednym przyciskiem (CSMoneyReporter)

  1. #1
    Członkowie honorowi FRICKEN_MORON's Avatar
    Join Date
    Jun 2009
    Location
    Pruszków
    Posts
    2,702

    Default Raportuj stan growego portfela jednym przyciskiem (CSMoneyReporter)

    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:







    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ć.

    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.
    1. 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.
    2. 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”.
    3. 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ą .

  2. #2
    Watażka lokalny Koziol's Avatar
    Join Date
    Jun 2009
    Posts
    698

    Default

    Ciekawy projekt. Fajnie opisanie, ale i tak nie będę z tego korzystał

  3. #3
    Członkowie honorowi FRICKEN_MORON's Avatar
    Join Date
    Jun 2009
    Location
    Pruszków
    Posts
    2,702

    Default

    A z@t3m pi0n@, Sh@n()VVnY K()źle!

    A tak poważniej rzecz biorąc, to przydatność tego jest oczywiście tylko klanówkowa. Na normalnym serwerze nie ma co się kasą chwalić, no bo jeszcze jjacyś zbójcy napadną i zabiorą . Program zaś jest bardzo sprytny i też mało znany, dlatego, myślę, wart był opisania. Póki co jednak, pojawiła się nowa wersja, które te wszystkie polecane przeze mnie sztuczki z konfiguracją implementuje już jako domyślne, więc niebawem trzeba to będzie jeszcze zaktualizować, a część rzeczy nawet napisać od nowa. A jeśli komuś coś takiego się przydaje, to polecam korzystać już dziś - jak już napisałem, program naprawdę jest z kategorii tych najlepszych .

  4. #4
    Honorowy żywiciel Demonagrywacza
    Join Date
    Aug 2009
    Posts
    434

    Default

    freezetime na cw to jakieś 12 sekund, spokojnie wystarczy zeby napisac te kilka cyferek. Przebajerowane to .


    ps. skad ja kojarze ten nick na tych screenach?

  5. #5
    Członkowie honorowi FRICKEN_MORON's Avatar
    Join Date
    Jun 2009
    Location
    Pruszków
    Posts
    2,702

    Default

    Czy przekombinowane? Może trochę, jakby tak sobie spojrzeć na ten tekst pierwszy raz - długi i jeszcze z tymi konfigami powklejanymi. W praktyce to jednak znacznie prostrze, zwłaszcza że w nowej wersji są już te wszystkie triki konfiguracyjne, które ja tutaj polecałem, właśnie by sprawy uprościć .

    Czy czasu na freezetime jest wystarczająco dużo? Pewnie jest go sporo, tak naprawdę nie wiem , klanówkowego doświadczenia nie mam za wiele, ale pewnie też prawdą jest, że:
    • łatwiej klanowiczów zdyscyplinować, dając im taki program jako narzędzie
    • i też na respawnie dzieją się pewnie na tych meczach różne rzeczy, sobie ludzie mogą chcieć wymienić bronie, zakupić bronie, czy omówić pokrótce taktykę - taki skrypt daje tutaj jednak wymierny czasowy zysk. I nie wymaga poświęcania sprawie uwagi.

    A nick... pojawił się z konfiga .

  6. #6
    Honorowy żywiciel Demonagrywacza
    Join Date
    Aug 2009
    Posts
    434

    Default

    No to rekrutuj ludzi i sprawdź czy rzeczywiście sie to przyda. Bo czy ktokolwiek z obecnych tutaj gra jakieś klanówki xD?


    ps. jednak masz komputer i csa!

  7. #7
    Członkowie honorowi Pudełko's Avatar
    Join Date
    Jun 2009
    Posts
    168

    Default

    Attached Images

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts