Перейти к содержанию

Cheat Engine 6.5 Release Candidate 2


SER[G]ANT

Рекомендуемые сообщения

Cheat Engine 6.5 RC2

 

Изменения по сравнению с RC1

 

Changes/fixes: 
* When using dissect data with mono you now get a choice if you wish to use it. Including options for always or never. (Always is the old behaviour) 
* Fixed PE dissection on live targets 
* Added " symbols around strings in the disassembler. (mov eax,"blabla" will show as "bla bla" mov eax,addresswithblabla will show as ["bla bla"] ) 
* fixed the simple float value with between scans 
* the plugin system memorybrowser context popup callback now also provides a "show" parameter (if the version is 6 or higher). 
* The rip relative scanner now has an option to also return the addresses of 5+ byte jmp and call instructions. (so also useful for 32-bit) 
* Added getInternet() to return an Internet class object you can use to download pages with. (If you don't like it add "getInternet=nil" to main.lua) 
* Added setLayeredAttributes(Key, Alpha, Flags) to the wincontrol class. (In win8 it can be used on controls as well, but in win7 only on forms) 
* Added the Handle property to the WinControl class 
 
 
(Hopefully I can get a new years release (+/- the 7 days after release of minor patches)) 
 
(I havn't changed the read/write* functions related to symbols. That may cause unpredicted behaviour in existing scripts) 
 
Known bug: Simple float values has no effect on next scan 
 
Русификатор подходящий под RC2
Изменено пользователем SER[G]ANT
  • Плюс 4
Ссылка на комментарий
Поделиться на другие сайты

Всё бы не чего, да плагины не пашут на нем... Да ну и ладно, и без них сойдет,всё равно давно уже ими не пользуюсь... В ручную правлю то, что может изменится.


Руссификатор вошел как надо прям от 6.4 - хотя тут и не велика разница то между ними... Может звук хотя бы будет проигрывать без совместимость с win 7 а то уже как то под достало везде подписывать о этой совместимости.


Проверил сейчас и всё норм - совместимость ставить не надо теперь под десяткой.  :)


И не то размер трейнера стал больше  :unsure:  или мне кажется... Ранее готовый упаковывался по х32 в 2.8 mg  а теперь пустой проект упаковывает уже в 2.9 интересно...  Кто бы ещо намекнул байту о том, что бы сделал бы он - что бы файлы можно было бы добавлять кучей(выделил 20 штук и сразу добавил) а не по одному торкать... Это на пример анимацию в трейнер добавлять хорошо, когда кадров по 40 штук и так далее.

Изменено пользователем LIRW
Ссылка на комментарий
Поделиться на другие сайты

DB многое менял\добавлял + перешёл на новую версию lua. Так что да, большинство плагинов не будут работать, скорее всего. Просто нужно подождать обновление плагинов. 

 

Со звуком там какая проблема была.

Для проигрывания использовалась библиотека uFMOD, которая сама по себе нормально работает и в win8, и в win10. Но т.к. она компилировалась только по x86, то DB пришлось сделать посредника в виде XMPlayer.exe. И вот на Windows 8 и выше XMPlayer.exe не работал.

 

Теперь же xmplayer.exe убран, а uFMOD заменён на mikmod, который нормально работает на всех системах. Кстати, теперь можно проигрывать ни только .xm файлы, но и .mod, .it

 

А то что вес трейнера вырос, оно и понятно. Трейнер включает в себя .exe Cheat Engine и нужные для его работы файлы, которые с каждой версией всё прибавляют в кол-ве и весе.

Как по мне, так DB не очень озабочен по поводу CE-трейнеров и его размера, проще говоря - пофиг (Тот же xmplayer был убран только сейчас, а не с релизом Win8).

 

"что бы файлы можно было бы добавлять кучей"

Так можно же.

 

Насчёт русификатора. Он будет обновлён сразу после релиза 6.5 ну или сейчас можешь скачать отсюда http://forum.gamehacklab.ru/files/file/21-cheat-engine/  (правда это не окончательная его версия)

Изменено пользователем SER[G]ANT
Ссылка на комментарий
Поделиться на другие сайты

На 100kb размер трейнеров прибавился... А то что музон добавлять и другого формата можно - это хорошо... Хотя между ними особого размера то не ощутимо. Хотя разок был у меня mod файл и пихать стал его в СЕ,а не тут то было... пришлось конвертировать его в xm и размер прибавился с 10-20 kb  а для такого то вида файла это уже многовато.


Для СЕ я имею введу это не ощутимо  :)  с трейнром в 3 mg на максимальном сжатии (не CE ным встроенным) 

Ссылка на комментарий
Поделиться на другие сайты

Была у меня давно хардкорная мысль - сжать (хоть тем же UPX) СЕшные файлы (которые лежат в директории установленного СЕ), которые генератор СЕ кидает в трейнер, и собрать трейнер заново.

По идее, вес трейнера на выходе должен быть намного меньше, хотя не ручаюсь, что не будет каких-то ошибок. Если интересно - можешь попробовать.

Ссылка на комментарий
Поделиться на другие сайты

Я Алекс наверное с годик уже не жал стандартным СЕ ным упаковщиком...  Жал разными и выигровал было до полутра мегабайта в размере.Но потом эти пакеры стали детектится антивирусом и пришлось уйти на обычный пе компакт.  В нем есть плагин написанный кем то под х64 и он жал уже файл под 2.5 mg... До выхода СЕ в версии 6.5  :)  тут размер уже бегает в промежутке между 100-150 kb (ну на столько и прибавился вес трейнера) В общем пустой проект стал размером больше, чем уже готовый на 100-150 kb

Ссылка на комментарий
Поделиться на другие сайты

Не слышал о таком, чтобы UPX кем-то детектился, как вирус. Некоторые антивирусы (как правило - самые бестолковые) определают программу, упакованную UPX-ом, как "Packed", но ни один антивирь из тех, что юзеры чаще используют - на UPX не ругается.

Ссылка на комментарий
Поделиться на другие сайты

Да понаставят всякой дребидени и вот потом начинается.  UPX по моему встроен в СЕ от того что он бесплатен и автор как бы не упрекнет DB за то, что то использует его в своих наработках... До этого я ииспользовал китайский упаковщик, жал очень прям не плохо и выигрывал даже у пе компакта.  Но как и писал уже, люди жаловаться начали, что мол вирус там, не качает у них... Ну и из за этого пришлось сменить его,а через буквально недели 2 - Касперский стал его детектить(этот китайский упаковщик): естественно как пакер которым можно что то заныкать в файл. Называется он NsPack v3.7 

Мне как бы без разницы чем упаковывать файл, лишь бы размер его уменьшить, так как 4 mg по дефолту СЕ для трейнера много... Хотя я видел и по 50 мегабайт трейнеры и не чего :) люди вроде бы в комментариях этим не упрекали.

Изменено пользователем LIRW
Ссылка на комментарий
Поделиться на другие сайты

Я лично перестал заморачиваться по поводу упаковщика - выкладываю не сжатые версии трейнеров.. Пусть лучше люди нормально пользуются, чем будут опасаться ругательств антивируса!

Ссылка на комментарий
Поделиться на другие сайты

Из новых окон я увидел только окно, которое ищет изменённые права регионов памяти (ну и наверно блоков памяти). Из визуальных изменений вроде больше ничего.

 

Много изменений по Lua функционалу. Могу выделить 8 моментов. 

  1. Появились функции работы с локализацией
  2. Брейкпоинт можно связывать с Lua функцией (теперь это не одна общая функция)
  3. Класс DissectCode я надеюсь теперь позволяет получить список адресов определенных инструкций, если не из всех, то из большинства найденных (прыжки, условные прыжки, вызовы)
  4. Новые классы по работе со структурами
  5. Новый класс TreeView. С его помощью можно попарсить трейслоги, т.к. они в TreeView компонентах
  6. Календарик появился. Мелочь, а приятно. Дату и время сохранить в нужном моменте.
  7. setUserRegistryEnvironmentVariable(name, string) позволит запомнить название и строковый параметр в "историю". Если надо будет прочитать, то getUserRegistryEnvironmentVariable(name): string.
  8. stringToMD5String(string): Returns an md5 hash string. Позволит данные строки прохешировать в md5. Например, первые 255 байт текстуры переводим в строку и хешируем. Запоминаем эту текстуру по хешу.

 

Есть новое по dbvm и dbk, но практическое применение их не очень понимаю. Это что-то типа двойной отладки, т.е. отладки отладки. 

 

Более полное описание "нового" собрал по памяти из main.lua. Некоторые классы уже были, но в них новые функции. В общем кому интересно. Могут попадаться и старые функции, т.к. не помню точно.

 

 

reloadSettingsFromRegistry(): This will cause cheat engine to reload the settings from the registry and apply them



getTranslationFolder(): Returns the path of the current translation files. Empty if there is no translation going on
loadPOFile(path): Loads a .PO file used for translation
translate(string): Returns a translation of the string. Returns the same string if it can't be found
translateID(translationid: string, originalstring: string OPTIONAL): Returns a translation of the string id


errorOnLookupFailure(state): If set to true (default) address lookups in stringform will raise an error if it can not be looked up. This includes symbolnames that are not defined and pointers that are bad. If set to false it will return 0 in those cases
(Useful for pointers that don't work 100% of the time)
6.4+:Returns the original state

getUserRegistryEnvironmentVariable(name): string - Returns the environment variable stored in the user registry environment
setUserRegistryEnvironmentVariable(name, string) - Sets the environment variable stored in the user registry environment
broadcastEnvironmentUpdate() : Call this when you've changed the environment variables in the registry. This will cause at least the shell to update so you don't have to reboot. (It's always recommended to reboot though)

stringToMD5String(string): Returns an md5 hash string from the provided string

registerFormAddNotification(function(form)): Registers a function to be called when a form is attached to ce's form list. This is useful for extentions that add new functionality to certain existing forms. It returns an object you can use with unregisterFormAddNotification
unregisterFormAddNotification(Object)

getSettingsForm(): Returns the main settings form

getLuaEngine() : Returns the lua engine form object (Creates it if needed)

reinitializeDotNetSymbolhandler(modulename OPTIONAL): Reinitializes only the DotNet part of the symbol list. (E.g After an ILCode has been JITed) (6.4+)

registerAutoAssemblerCommand(command, function(parameters, syntaxcheckonly)): Registers an auto assembler command to call the specified function. The command will be replaced by the string this function returns when executed. The function can be called twice. Once for syntax check and symbol lookup(1), and the second time for actual execution by the assembler(2) if it has not been removed in phase1.
Note: The callback function can return multiple values
Nil, 'String': Will raise an error with the given string
MultilineString: Replaces the line in the script with the given strings.


If the function returns nil, and as secondary parameter a string, this will make the auto assembler fail with that error

unregisterAutoAssemblerCommand(command)

registerSymbolLookupCallback(function(string):integer, location): ID 6.4+
Registers a function to be called when a a symbol is parsed
Location determines at what part of the symbol lookup the function is called
slStart: The very start of a symbol lookup. Before tokenization
slNotInt: Called when it has been determined it's not a hexadecimal only string. Before tokenization
--The following locations can be called multiple times for one string as they are called for each token and appended token
slNotModule: Called when it has been determined the current token is not a modulename
slNotUserdefinedSymbol: Called when it has been determined it's not a userdefined symbol
slNotSymbol: Called when it has been determined it's not a symbol in the symbollist
slFailure: Called when it has no clue what the given string is

Note: slNotSymbol and slFailure are similar, but failure comes only if there's no token after the current token that can be concatenated. Else slNotSymbol will loop several times till all tokens make up the full string


Return an Integer with the corresponding address if you found it. Nil or 0 if you didn't.

unregisterSymbolLookupCallback(ID): Removes the callback


registerAddressLookupCallback(function(integer):string): ID
Registers a function to be called when the name of an address is requested

unregisterAddressLookupCallback(ID): Removes the callback


registerStructureDissectOverride(function(structure, baseaddress): table):
same as onAutoGuess, but is called by the structure dissect window when the user chooses to let cheat engine guess the structure for him.
Use the structure object to fill it in
Return true if you have filled it in, or false or nil if you did not

Tip: Use inputQuery to ask the user the size if your function doesn't do that automatically


unregisterStructureDissectOverride(ID)

registerStructureNameLookup(function(address): name, address OPTIONAL):
Registers a function to be called when dissect data asks the user for the name of a new structure define. If you have code that can look up the name of a structure, and perhaps also the real starting point, you can use this to improve the data dissection.

unregisterStructureNameLookup(ID)

registerAssembler(function(address, instruction):bytetable)
Registers a function to be called when the single line assembler is invoked to convert an instruction to a list of bytes
Return a bytetable with the specific bytes, or nil if you wish to let another function, or the original x86 assembler to assemble it

unregisterAssembler(ID): Unregisters the registered assembler

registerAutoAssemblerPrologue(function(script, syntaxcheck))
Registers a function to be called when the auto assembler is about to parse an auto assembler script. The script you get is after the [ENABLE] and [DISABLE] tags have been used to strip the script to the according one, but before comment stripping and trimming has occured

script is a Strings object which when changed has direct effect to the script

unregisterAutoAssemblerPrologue(ID)

registerCustomTypeLua(typename, bytecount, bytestovaluefunction, valuetobytesfunction, isFloat)
Registers a Custom type based on lua functions
The bytes to value function should be defined as "function bytestovalue (b1,b2,b3,b4)" and return an integer as result
The value to bytes function should be defined as "function valuetobytes (integer)" and return the bytes it should write


registerCustomTypeAutoAssembler(script)
Registers a custom type based on an auto assembler script. The script must allocate an "ConvertRoutine" and "ConvertBackRoutine"

onAutoGuess(function) :
Registers an function to be called whenever autoguess is used to predict a variable type
function override (address, ceguess): Return the variable type you want it to be. If no change, just return ceguess


debug_getCurrentDebuggerInterface() : Returns the current debuggerinterface used (1=windows, 2=VEH 3=Kernel, nil=no debugging active)
debug_canBreak(): Returns true if there is a possibility the target can stop in a breakpoint. 6.4+
debug_getBreakpointList(): Returns a lua table containing all the breakpoint addresses
debug_addThreadToNoBreakList(threadid): This will cause breakpoints on the provided thread to be ignored
debug_removeThreadFromNoBreakList(threadid): removed the threadid from the list

debug_setBreakpoint(address, size OPTIONAL, trigger OPTIONAL, breakpointmethod OPTIONAL, functiontocall() OPTIONAL) : sets a breakpoint of a specific size at the given address. if trigger is bptExecute then size is ignored. If trigger is ignored then it will be of type bptExecute, which obviously also ignores the size then as well
debug_setBreakpoint(address, size OPTIONAL, trigger OPTIONAL, functiontocall() OPTIONAL)
debug_setBreakpoint(address, functiontocall() OPTIONAL)

getHeader(address) : Gets the userdefined header at the specified address
setHeader(address) : Sets the userdefined header at the specified address

registerBinUtil(config) Registers a binutils toolset with CE (for assembling and disassembling in other cpu instruction sets)
config is a table containing several fields that describe the tools, and lets you specify extra parameters

Name : The displayed name in the binutils menu in memview
Description: The description for this toolset
Architecture: used by the objdump -m 'architecture' (required)
ASParam : extra parameters to pass on to AS (optional)
LDParam : extra parameters to pass on to LD
OBJDUMPParam: extra parameters to pass on to OBJDUMP
OnDisassemble: a lua function that gets called each time an address is disassembled. The return value will be passed on to OBJDUMP
Path: filepath to the binutils set
Prefix: prefix (e.g: "arm-linux-androideabi-")
DisassemblerCommentChar: Depending on which target you're disassembling, the comment character can be different. (ARM=";" x86='#' )

--------
Settings class
This class can be used to read out and set settings of cheat engine and of plugins, and store your own data

global functions
getSettings(path Optional): Settings - Returns a settings object. If path is nil it will points to the Cheat Engine main settings (Registry) . If name is provides the settings currently accessed will be the one at the subkey provided
Note: Keep in mind that it returns a new object each call, even if he same name is used multiple times


properties
Path: string - Gets/Sets the current subkey (nil if main)
Value[]: A table access into the settings. e.g: Value["Count"]=12

methods
----
SymbolList class
This class can be used to look up an address to a symbolname, and a symbolname to an address
It can also be registered with the internal symbol handler of cheat engine

This class makes use of a special "Symbol" table construction that contains size and optionally other data
Symbol Table:
modulename: string
searchkey: string
address: integer
symbolsize: integer

Global functions
createSymbolList() : Creates an empty symbollist




Properties
Methods
clear()
getSymbolFromAddress(address) : Searches the list for the given address. The address does not have to match the exact address. As long as it falls withing the range
getSymbolFromString(searchkey)
addSymbol(modulename, searchkey, address, symbolsize, skipAddressToSymbolLookup OPTIONAL, extradata OPTIONAL)
Adds a symbol to the symbollist
extradata is a table which can be used to fill in a return type and parameters for function calls. It has the following fields:
returntype: string
parameters: string



deleteSymbol(searchkey)
deleteSymbol(address)
register() : Registers the current symbol list with the symbol handler
unregister(): Unregisters the current symbol list from the symbol handler
------
DissectCode class: (Inheritance: Object)
getDissectCode() : Creates or returns the current code DissectCode object

properties:
methods:
clear() : Clears all data
dissect(modulename) : Dissects the memory of a module
dissect(base,size) : Dissect the specified memory region

addReference(fromAddress, ToAddress, type, OPTIONAL isstring):
Adds a reference. Type can be jtCall, jtUnconditional, jtConditional, jtMemory
In case of rtMemory setting isstring to true will add it to the referenced strings list

deleteReference(fromAddress, ToAddress)


getReferences(address) : Returns a table containing the addresses that reference this address and the type
getReferencedStrings(): Returns a table of addresses and their strings that have been referenced. Use getReferences to find out which addresses that are

saveToFile(filename)
loadFromFile(filename)
-

-------
Disassembler Class (Inheritance: Object)



createDisassembler() - Creates a disassembler object that can be used to disassemble an instruction and at the same time get more data
getDefaultDisassembler() - Returns the default disassembler object used by a lot of ce's disassembler routines
getVisibleDisassembler() - Returns the disassembler used by the disassemblerview. Special codes are: {H}=Hex value {R}=Register {S}=Symbol {N}=Nothing special

registerGlobalDisassembleOverride(function(sender: Disassembler, address: integer, LastDisassembleData: Table): opcode, description): Same as Disassembler.OnDisassembleOverride, but does it for all disassemblers, including newly created ones. Tip: Check the sender to see if you should use syntax highlighting codes or not
This function returns an ID you can pass on to unregisterGlobalDisassembleOverride() 6.4+

unregisterGlobalDisassembleOverride(id)

properties
LastDisassembleData : Table
OnDisassembleOverride: function(sender: Disassembler, address: integer, LastDisassembleData: Table): opcode, description
syntaxhighlighting: boolean : This property is set if the syntax highlighting codes are accepted or not

Methods
disassemble(address): Disassembles the given instruction and returns the opcode. It also fills in a LastDisassembleData record
decodeLastParametersToString() : Returns the unedited "Comments" information. Does not display userdefined comments
getLastDisassembleData() : Returns the LastDisassembleData table.
The table is build-up as follow:
address: integer - The address that was disassembled
opcode: string - The opcode without parameters
parameters: string - The parameters
description: string - The description of this opcode
bytes: table - A table containing the bytes this instruction consists of (1.. )

modrmValueType: DisAssemblerValueType - Defines the type of the modrmValue field (dvtNone=0, dvtAddress=1, dvtValue=2)
modrmValue: Integer - The value that the modrm specified. modrmValueType defines what kind of value

parameterValueType: DisAssemblerValueType
parameterValue: Integer - The value that the parameter part specified

isJump: boolean - Set to true if the disassembled instruction can change the EIP/RIP (not ret)
isCall: boolean - Set to true if it's a Call
isRet: boolean - Set to true if it's a Ret
isConditionalJump: boolean - Set to true if it's a conditional jump
---------
Structure class related functions:
getStructureCount(): Returns the number of Global structures. (Global structures are the visible structures)
getStructure(index): Returns the Structure object at the given index
createStructure(name): Returns an empty structure object (Not yet added to the Global list. Call structure.addToGlobalStructureList manually)
----------
StructureFrm class:
createStructureForm(address)
properties:
Column[index]: structColumn - Fetches a structColumn object from the structure form
Group[index]: structGroup - Fetches a structGroup object from the structure form

methods:
structChange() : Forces a refresh
addColumn(): Adds a new column in the currently focuses group and returns it's structColumn object
addGroup(): Adds a new group and returns the structGroup object
-----------------
structColumn class:
properties:
Address: integer - The current address
AddressText: string - Gets/sets the visual address
Focused: boolean - Gets/sets the focused state

methods:
focus(): focuses the current column

---------
structGroup class:
properties:
name: string - gets the current name
box: Groupbox - Gets the groupbox object
columnCount: integer- Gets the number of columns in the group
columns[index]: structColumn - Returns the specific structColumn object


methods:
addColumns(): Adds a new columns to the specific group and returns it's structColumn objecy
------------------------
structure class: (Inheritance: Object)
Properties:
Name: String - The name of the structure
Size: Integer - The number of bytes between the last element and the start. ReadOnly
Count: Integer - Number of elements in the structure. ReadOnly
Element[]: structureElement - Returns the structure element at the given index. Readonly
Methods:
getName(): Returns the name
setName(name): Sets the name
getElement(index): Returns a structureElement object (Changing offsets can change the index)
getElementByOffset(offset): Returns a structureElement object where the specified offset is at least the requested offset
addElement(): Adds a new blank structureElement and returns it
autoGuess(baseaddresstoguessfrom, offset, size)
fillFromDotNetAddress(address, changeName): Fills the structure with the layout gathered from querying .NET. If changeName is true, the structure will take the name of the .NET class. (6.4+)

beginUpdate(): Call this when you want to make multiple updates to a structure. It will speed up the update process
endUpdate(): Call this when done
addToGlobalStructureList(): Add this to the list of structures for the user to select from. (Global structures will get saved to the table)
removeFromGlobalStructureList(): Remove from the list of structures.

---------------
StructureElement class: (Inheritance: Object)
Properties:
Owner: structure - The structure this element belongs to. Readonly
Offset: integer - The offset of this element
Name: string - The name of this element
Vartype: integer - The variable type of this element
ChildStruct: structure - If not nil this element is a pointer to the structure defined here
ChildStructStart: integer - The number of bytes inside the provided childstruct. (E.g: It might point to offset 10 of a certain structure)
Bytesize: integer - The number of bytes of this element. Readonly for basic types, writable for types that require a defined length like strings and array of bytes

Methods:
getOwnerStructure(): Returns the structure this element belongs to
getOffset(): Returns the offset of this element
setOffset(offset): Sets the offset of this element
getName(): Returns the name of this element
setName(name): Sets the name of this element (tip: Leave blank if you only want to set the name of the variable)
getVartype(): Returns the variable type of this element (check Variable types in defines.lua)
setVartype(vartype)
getChildStruct()
setChildStruct(structure)
getChildStructStart()
setChildStructStart(offset)
getBytesize(): Gets the bytesize of the element. Usually returns the size of the type, except for string and aob
setBytesize(size): sets the bytesize for types that are affected (string, aob)
-----------
Application Class: (Inheritance: CustomApplication->Component->Object)
properties
Title: The title of cheat engine in the bar

methods
bringToFront(): Shows the cheat engine app
------------
Calendar Class: (Inheritance: WinControl->Control->Component->Object)
createCalendar(owner): Creates a Calendar class object which belongs to the given owner. Owner can be any object inherited from WinControl. Valid date is between "September 14, 1752" and "December 31, 9999"

properties
Date: string - current date of the Calendar, format: yyyy-mm-dd
DateTime: number - days since December 30, 1899

methods
getDateLocalFormat - returns current date of the Calendar, format: ShortDateFormat from OS local settings
----------
Полное описание следующих классов не буду приводить

Listview сlass
TreeNode class
TreeNodes class

...

Ссылка на комментарий
Поделиться на другие сайты

Я, помню, попросил DB сделать возможность перевода строк из скриптов в папке autorun. И чуть позже появились "функции работы с локализацией".

Возможно эта функция отвечает за это

translate(string): Returns a translation of the string. Returns the same string if it can't be found

Но не пойму как её применить. Ладно бы если это было translate(оригинал;перевод), а так, не понятно

Изменено пользователем SER[G]ANT
Ссылка на комментарий
Поделиться на другие сайты

print(translate('Open'))print('Путь текущего файла перевода ' .. getTranslationFolder())--Примеры переводаprint(translate('Close'))print(translate('Yes'))print(translateID('addresslist.rswhatvaluetochangethisto'))
Если выпонить код, то выведет

Путь текущего файла перевода C:\Program Files (x86)\Cheat Engine 6.5\languages\ru_RU\ Открыть Закрыть Да на какое значение изменить? 
translate() и translateID() возвращает перевод того "*.po" файла, который загружен.

Это значит если хотим перевести с английского на русский, то надо чтобы был загружен русский "*.po".

Если хотим русского на английский сразу и без перезагрузки CE, то похоже никак не сделать. Потому что

 

loadPOFile(getCheatEngineDir()..'languages\\cheatengine-x86_64.po') 
не работает, язык только в ini переключать и перезагружать CE. В общем с русского на английский у меня не получилось получить перевод. Надо писать парсер двух .po файлов на lua, больше никак.
Ссылка на комментарий
Поделиться на другие сайты

Сейчас заметил одни баг. Трейнер нельзя запустить после того, как запущена уже игра. Ошибка в луа будет. Ну это бета и как бы что то от неё ожидать полноценного то и не стояло.


Мне просто попадались игры на движках вроде вольфенштейна первого и на пример hl ,амнезия и тому подобных.. И всегда надо было запускать трейнер уже после запуска игры, не аттачился что то он нормально к процессу, а в этом я не пробовал ещо,но думаю это дело поправили.. Щас вот исправлял трейнер и запустил его уже после запуска игры и вылезла ошибка луа, без всего - просто окно луа с выполнением,а так бы и не заметил данной проблемы. Вчера я на это не обратил внимания - подумал баг какой то,а сегодня ситуация повторилась.

Ссылка на комментарий
Поделиться на другие сайты

отправил репорт

Она просто висит,её можно закрыть и пользоваться трейнером дальше,но опять же это баг - так не должно быть. А то что отправил - спасибо  :rolleyes:  

5ad7d63c7932773f7ee27d43d089aa4f.jpg
Ссылка на комментарий
Поделиться на другие сайты

А у меня другая проблема, музыка не прекращает играть. А Если выбрать прекращение проигрывания, когда трейнер теряет фокус, то ещё и луа ошибки сыпятся.

Ссылка на комментарий
Поделиться на другие сайты

У меня Сержант с музыкой нормально всё. Я уже наверное трейнеров 5 сделал на бета СЕ и такой проблемы не замечал. Ну у каждого как бы свои они,в смысле ошибки то... Из за версии win тоже наверное могут быть... 

Ссылка на комментарий
Поделиться на другие сайты

Вышла вторая бэта, ссылку обновил.

 

Закачивает почему то Beta 1 а не Beta 2

 

или нужно орентироваться по rev2149

Изменено пользователем Dison
Ссылка на комментарий
Поделиться на другие сайты

Закачивает почему то Beta 1 а не Beta 2

 

или нужно орентироваться по rev2149

Я кстати тоже об этом подумал  :mellow:  поставил,включил,а там написано бета 1 - я ещо подумал, может перепутал со старой бетой exe файл, но нет - дата создания была разной O-=

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.