-
Постов
2 999 -
Зарегистрирован
-
Победитель дней
129
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные MasterGH
-
-
Судя по посту Xipho, есть надежда, что хоть какой-то форум будет
Я предлагаю идею привязать активных пользователей к разделам форума.
- повторяющиеся вопросы — разрешать. Для этого специальный лояльный модератор-помогатор и специальный раздел "Вопросы для начинающих". У раздела создать подразделы. Несколько. Пока не знаю какие. Я бы нзначил Питроника(желание помочь) и Гарика(вежливость + опыт) на этот раздел. Название подразделов обсудить с ними.
- готовые ответы — разрешать. Раздел "Вопрос-ответ". Этот раздел специально для тех, кому надо быстро и без проблем получить ответ и не ковыряться по два часа. Назначил бы модератором Partizan. Т.к. он выдает готовые ответы часто. Но, если раздел для начинающих, то Partizan там не пишет готовые ответы сразу. Подразделы здесь обсудить с Partizan
- раздел "Опытные". На него поставить imaginary, justHack. Подразделы обсудить с ними. В этом разделе нельзя задавать "тупых вопросов". Иначе перенаправят тему для начинающих. Рекомендую сделать в этой теме FAQ. Чтобы самим не забыть, что вопросы уже обсуждали.
- Раздел "общение". Подраздел "Решение вопросов". Поставить Garik66, SerVick, Antonshka для решение споров. Цель — найти компромисс. Сообщения с разборками отправлять туда или создавать темы отельные. В конце темы — принятие решения. Есть спор возник, то его надо обязательно решить и написать в конце темы решение.
- DieVisn и Alex2411 могут быть модераторами в разделе публикаций. Например в подразделе "таблицам CE". их контролю содержания, что они работают. Следить за отвзывами по таблицам. Если, конечно, Alex2411 захочет и остальные не будут против.
Ну, как-то так. Т.е. идея разделы разбить по активным позициям иначе мы не сдвинемся — никто писать не будет, т.к. друг друга "блокируем" и начинает какой-нибудь разбор полетов.
- 2
-
Есть множество предложений создать бесплатный форум. Примеры
Можно будет свободно общаться как и раньше.
У кого-то будет время и тот сможет наполнять разделы.
Кто-то сможет быть модератором.
И совсем необязательно будущий форум закрывать, если там не будет активности или не будет времени им заниматься.
Согласовать надо два момента (это к тебе xipho):
1) объявление о том, что форум переехал по другому адресу
2) ссылку на этот форум разместить по возможности на видом месте. Чтобы человек мог перейти по ссылке.Этот вариант для тех, кто хочет продолжать общаться на форуме, создавать темы, писать комментарии, ставить оценки и т.п.
- 1
- 1
-
12 минут назад, Pitronic сказал:
Понял. А как моя редакция скрипта?
Наверно, надо целиком таблицу .CT смотреть. Так ошибки.
По скрипту и сравнению с прошлой версией, вроде, нормально.
-
Скорее всего, так решил Dark Byte и посчитал, что такое число нажатий достаточно. Число нажатий можно проверить в окне установки hotkeys при редактировании memory record через контекстное меню
-
Я не особо любитель автономных трейнеров. Если бы я заморочился, то т.к. форма генерируемого трейнера продолжает работать с обычными MemoryRecord из таблицы CE, то можно в MemoryRecord подменять Hotkey. Я бы все удалил с формы. Создал бы сначала CECheckbox1, CEEdit1 и связал бы их с некоторым MemoryRecord по уникальному названию. В MemoryRecord подменял бы Hotkey через обработчик CEEdit1. По esc клавише стирать все, что в CEEdit1
СпойлерПотом бы для остальных записей по аналогии...
На мой взгляд, это большие заморочки и сложнее чем если писать на WinAPI + язык программирования. Я бы предложил просто пользоваться *.CT-таблицей 🙂
- 1
-
Спойлер
Разобраться будет непросто. Основной принцип надо уловить.
1) userDefinedKeys - Lua-таблица с hot-keys. Не более 5 комбинаций нажатий. В эту таблицу происходит запись и чтение.
2) (object1.ClassName=='tcheat') and (object2.ClassName=='TMemoryRecordHotkey') это типы недокументированные в celua.txt. Экземпляры этих типов генерируются на форме при создании hot-keys
Спойлер3) Сколько опций нагенерировали на форме, столько надо добавить потом. например
addChangeHotkeyKeysFunctionality(CETrainer.CHEAT0,memrec0_hotkey0) addChangeHotkeyKeysFunctionality(CETrainer.CHEAT1,memrec1_hotkey0) addChangeHotkeyKeysFunctionality(CETrainer.CHEAT2,memrec2_hotkey0)
4) userPressedKey - обработчик нажатий в поле ввода текста, который будет работать с таблицей кодов hotkeys userDefinedKeys на 5 нажатий
5) clearHotkey() - обработчик клика на кнопку, очистит таблицу кодов hotkeys userDefinedKeys
6) -- создание формы changeHotkeyKeysForm "local function formCreate()".
Принцип, который надо понять и уловить состоит в подмене хоткеев в tcheat и TMemoryRecordHotkey. Как именно подменяется можно увидеть по исходникам и по документации. К сожалению, документировано не все. Те, кто постоянно лазят на форуме CE, по исходником CE они знают и описание tcheat и TMemoryRecordHotkey.
С моими комментариями:
Спойлер-- обработчик нажатий до 5 hot-keys на поле для поля CEEdit1.OnKeyDown = userPressedKey (ниже задается) -- userDefinedKeys = {} таблица hot-keys local function userPressedKey(sender, key) if userDefinedKeys[5]==0 then for i=1,5 do if userDefinedKeys[i]==0 then userDefinedKeys[i]=key break else if userDefinedKeys[i]==key then break end end end end -- преобразование таблицы hot-keys в строку и запись в поле changeHotkeyKeysForm.CEEdit1.Text changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys) return 0 end -- Обработчик для очистки hot-key local function clearHotkey() userDefinedKeys={0,0,0,0,0} changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys) changeHotkeyKeysForm.CEEdit1.setFocus() end -- создание формы changeHotkeyKeysForm local function formCreate() changeHotkeyKeysForm=createForm(false) changeHotkeyKeysForm.Name = 'changeHotkeyKeysForm' changeHotkeyKeysForm.Caption = 'Hotkey Manually Set' changeHotkeyKeysForm.Width = 300 changeHotkeyKeysForm.Height = 120 changeHotkeyKeysForm.Position = poScreenCenter changeHotkeyKeysForm.OnClose = function () changeHotkeyKeysForm.CEEdit1.setFocus() return caHide end local CELabel1=createLabel(changeHotkeyKeysForm) CELabel1.Name = 'CELabel1' CELabel1.Left = 20 CELabel1.Top = 20 CELabel1.Caption = 'Set hotkey:' local CEEdit1=createEdit(changeHotkeyKeysForm) CEEdit1.Name = 'CEEdit1' CEEdit1.Text = '' CEEdit1.AnchorSideLeft.Control = CELabel1 CEEdit1.AnchorSideTop.Control = CELabel1 CEEdit1.AnchorSideTop.Side = asrBottom CEEdit1.Height = 25 CEEdit1.Width = 248 CEEdit1.BorderSpacing.Top = 4 local clearButton=createButton(changeHotkeyKeysForm) clearButton.Name = 'clearButton' clearButton.AnchorSideLeft.Control = CEEdit1 clearButton.AnchorSideTop.Control = CEEdit1 clearButton.AnchorSideTop.Side = asrBottom clearButton.Height = 30 clearButton.Width = 80 clearButton.BorderSpacing.Top = 8 clearButton.Caption = 'Clear' local applyButton=createButton(changeHotkeyKeysForm) applyButton.Name = 'applyButton' applyButton.AnchorSideLeft.Control = clearButton applyButton.AnchorSideLeft.Side = asrBottom applyButton.AnchorSideTop.Control = clearButton applyButton.Height = 30 applyButton.Width = 80 applyButton.BorderSpacing.Left = 10 applyButton.Caption = 'Apply' CEEdit1.OnKeyDown = userPressedKey -- обработчки нажатий -- https://lazarus-ccr.sourceforge.io/docs/lcl/controls/tmousebutton.html для записи хот-кей мышки. local mbtn={false,true,true,true} CEEdit1.OnMouseDown = function (s,k) if mbtn[k] then s.OnKeyDown(s,k+2) end end clearButton.OnClick = clearHotkey -- обработчик очистки hot-keys applyButton.ModalResult = mrYes -- apply button end -- Обработчик кнопки смены hot-key. Показывает форму смены hot-keys function changeHotkeyKeys(hotkey) -- если форма не создана, то создать if not changeHotkeyKeysFormCreated then changeHotkeyKeysFormCreated = true formCreate() end if hotkey==nil then return end -- таблица из пользовательский hot-keys. Максимум 5 userDefinedKeys={0,0,0,0,0} -- проверка на свопаданеие для ClassName=='TGenericHotkey' или на "TMemoryRecordHotkey" if hotkey.ClassName=='TGenericHotkey' then -- если TGenericHotkey, то запись клавиш -- TGenericHotkey, вроде, не документирована. Так что либо лезем в git либо запоминаем что есть .getKeys() у hotkey for i,v in ipairs({hotkey.getKeys()}) do userDefinedKeys[i]=v -- установка hot-key end -- показать таблицу с кодами hot-keys как строку changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys) -- запомнить что есть setKeys у hotkey типа TGenericHotkey. Передать пять нажатий if changeHotkeyKeysForm.showModal()==mrYes then hotkey.setKeys(userDefinedKeys[1],userDefinedKeys[2], userDefinedKeys[3],userDefinedKeys[4], userDefinedKeys[5]) end elseif hotkey.ClassName=='TMemoryRecordHotkey' then -- если же это TMemoryRecordHotkey for i,v in ipairs(hotkey.Keys) do userDefinedKeys[i]=v -- записать коды hot-key end -- показать строку changeHotkeyKeysForm.CEEdit1.Text=convertKeyComboToString(userDefinedKeys) -- если подвержедение закрытия формы через showModal()==mrYes, то назначить клавиши if changeHotkeyKeysForm.showModal()==mrYes then hotkey.Keys = userDefinedKeys end end end -- Функция для связи CETrainer.CHEAT0 и memrec0_hotkey0. Примеры ниже. -- object1 это тип условный тип tcheat, object2 это тип TMemoryRecordHotkey. Типы не документированы в celua.txt. Просто запомнить или лезть в git CE function addChangeHotkeyKeysFunctionality(object1, object2) if (type(object1)=='userdata') and (object1.ClassName=='tcheat') and (object2.ClassName=='TMemoryRecordHotkey') then local btn = createButton(object1.Owner) btn.Parent = object1.Parent btn.AnchorSideLeft.Control = object1 btn.AnchorSideTop.Control = object1 btn.Height = object1.Height btn.Width = 15 btn.BorderSpacing.Left = object1.Descriptionleft - 20 btn.Caption = 'E' -- создание кнопок вида "E" редактироавния hot-key btn.OnClick = function () changeHotkeyKeys(object2) object1.Hotkey = object2.HotkeyString end end end -- автоматическая, генерация как обычно. Оставить как есть для трех опций. --TRAINERGENERATORSTART-- --This is autogenerated code. Changing code in this block will --get erased and rewritten if you regenerate the trainer code --Uncomment the following line if this is a Cheat Table format trainer and you don't want CE to show (Tip, save as .CETRAINER alternatively) --hideAllCEWindows() RequiredCEVersion=6.6 if (getCEVersion==nil) or (getCEVersion()<RequiredCEVersion) then messageDialog('Please install Cheat Engine '..RequiredCEVersion, mtError, mbOK) closeCE() end addresslist=getAddressList() memrec0=addresslist.getMemoryRecordByID(0) memrec1=addresslist.getMemoryRecordByID(1) memrec2=addresslist.getMemoryRecordByID(2) memrec0_hotkey0=memrec0.getHotkeyByID(0) memrec1_hotkey0=memrec1.getHotkeyByID(0) memrec2_hotkey0=memrec2.getHotkeyByID(0) function onPostHotkey0(Hotkey) --Executed after the "toggle*" cheat got executed local memrec=Hotkey.Owner local isActive=memrec.Active --get the state after the hotkey got triggered CETrainer.CHEAT0.setActive(isActive) --gui update, nothing else if gPlaySoundOnAction then if isActive then playSound(gActivateSound) else playSound(gDeactivateSound) end end end memrec0_hotkey0.onPostHotkey=onPostHotkey0 function onPostHotkey1(Hotkey) --Executed after the "toggle*" cheat got executed local memrec=Hotkey.Owner local isActive=memrec.Active --get the state after the hotkey got triggered CETrainer.CHEAT1.setActive(isActive) --gui update, nothing else if gPlaySoundOnAction then if isActive then playSound(gActivateSound) else playSound(gDeactivateSound) end end end memrec1_hotkey0.onPostHotkey=onPostHotkey1 function onHotkey2(Hotkey) --Executed before the hotkey is handled CETrainer.CHEAT2.setActive(true, 1500) if gPlaySoundOnAction then playSound(gActivateSound) end end memrec2_hotkey0.onHotkey=onHotkey2 CETrainer.SEPERATOR.Visible=false getAutoAttachList().add("ddgd") gPlaySoundOnAction=false CETrainer.show() function AboutClick() showMessage(gAboutText) end gAboutText=[[This trainer was made by Cheat Engine www.cheatengine.org]] function CloseClick() --called by the close button onClick event, and when closing the form closeCE() return caFree --onClick doesn't care, but onClose would like a result end --TRAINERGENERATORSTOP-- -- А это уже дописывать. Сколько опций, столько и строк addChangeHotkeyKeysFunctionality(CETrainer.CHEAT0,memrec0_hotkey0) addChangeHotkeyKeysFunctionality(CETrainer.CHEAT1,memrec1_hotkey0) addChangeHotkeyKeysFunctionality(CETrainer.CHEAT2,memrec2_hotkey0)
Вариант, рабочий. Главное не запутаться, когда будешь переделывать под свой вариант меняя опции или добавляя свои.
Если что не понятно, то пиши. Я когда исходник открыл вообще ничего не понял. Когда начинаешь разбираться, потом картина выстраивается.
Если бы я делал с нуля, то, наверно, делал бы без tcheat и TMemoryRecordHotkey, но остальное почти также с convertKeyComboToString
-
- Проверить, чтобы переменные были без кавычек. Т.е. debug_continueFromBreakpoint(co_stepover), а не debug_continueFromBreakpoint('co_stepover').
- Функция debug_continueFromBreakpoint(co_stepover) делает шаг на следующую инструкцию не заходя в call. Далее прочитать регистры и далее вызывать debug_continueFromBreakpoint(co_run) чтобы отпустить отладку. Если этого не сделать, то ничего и не произойдёт — висит в отладке.
-
Учитывать нахождение на EIP при брейкпоинте на адресе брейкпоинта или на адресе следующем за адресом брейкпоинта. Например, это позволит прочитать eax из mov eax, [eax] двумя способами. 1 способ до перезаписи eax (EIP на инструкции брейкпоинта). Это software-брейкпоинт. Способ2 после перезаписи (EIP на инструкции следующей за инструкцией, на которой сработал брейкпоинт). Это hardware-брейкпоинт(он же по умолчанию).
Оба режима, можно ставить вручную или программно.debug_setBreakpoint(address, size OPTIONAL, trigger OPTIONAL, breakpointmethod OPTIONAL, functiontocall() OPTIONAL) -- Где на EIP повлияет --Breakpoint methods: bpmInt3=0 --- software breakpoint bpmDebugRegister=1 -- hardwarebreakpoint bpmException=2 -- ну, это не нужно(медленный), на регион памяти (где здесь EIP будет, уже не помню)
- 2
- 1
-
Да, лучше спросить у Дарк Байта.
Может быть, сделать можно через registerCustomTypeLua. Нет? Если есть желание. можешь погуглить.
Можешь написать на C# через чтение памяти
Спойлерstring text = "Заказ Р·РІРѕРЅРєР° технической поддержки"; Encoding utf8 = Encoding.GetEncoding("UTF-8"); Encoding win1251 = Encoding.GetEncoding("Windows-1251"); byte[] utf8Bytes = win1251.GetBytes(text); byte[] win1251Bytes = Encoding.Convert(utf8, win1251, utf8Bytes); Console.WriteLine(win1251.GetString(win1251Bytes));
Или другими программами попытаться просматривать память. Типа winHex
СпойлерМогут быть и программы альтернативы. Хотя CE как небольшой комбайн, но не все же ему уметь делать во всех кодировках. Пробуй IDA, Hidra и т.п.
-
22 часа назад, ктота сказал:
Существует ли возможность добавить дополнительную кодировку текста, чтоб можно было прямо в памяти процесса распознавать русский текст?
Отвечая на вопрос существует ли возможность, то она лично у Вас теоретически всегда существует, а именно самостоятельно изучить программирование и сделать, но вряд ли кто-то другой будет этим заниматься с отдельной кодировкой.
Логику работы кодировки можно увидеть в исходниках MemoryBrowserFormUnit, исходниках hexviewunit.pas. Там не только чтение, но и запись в кодировке.
-
18 часов назад, Partizan сказал:
Может не в тему. Но как сделать средствами СЕ вменяемый тренер. Допустим на эту таблицу?
Ну, такой я предлагать не буду 😃
Спойлерhttp://i.imgur.com/mhHAyN6.png
Ну, может такой вменямый (визуально)?
Спойлерhttp://forum.cheatengine.org/files/capture2_108.jpg
Большое количество опций, наверно, лучше оставить в таблице как есть без трейнеров. Вот пример
СпойлерИли вот такая вменяемая таблица?
СпойлерИли такая
СпойлерВо всяком случае можно выбрать отдельные опции или сгруппировать их, что-то вроде этого вполне вменяемо (сделан на Cheat Engine)
СпойлерА если опций еще больше и нужны галки, то тогда использовать контролы. Списки, вкладки и т.п.
-
4 часа назад, Pitronic сказал:
Сыылка не рабочая перезалей пажалуйста.
Ты уверен, что нужна ссылка? Это плагины к OllyDbg.
Ссылки все битые. Им лет 10. Можешь поискать в Интернете "OllyDbg и названия этих плагинов".
-
9 часов назад, Pitronic сказал:
В общем мне даже не обязательно подключение к процессу се уже подключено, мне нужна активация диактивация дочерних скриптов в таблице. Активировал один он автоматом активировал другой.
Хотя ответ был, но я приведу функции, которые могут пригодится
1. Открытие процесса: openProcess("Tutorial-i386.exe")
2. Добавить процесс в список процессов для автоподкючения: getAutoAttachList().add("Tutorial-i386.exe")
3. Функция, которая срабатывает, когда процесс подключился:
function onOpenProcess(processid) // здесь некоторый код end
4. Активация записи по её имени: getAddressList().getMemoryRecordByDescription("Название записи в таблице CE").Active = true.
Если такой записи еще в таблице нет, то вызовет ошибку.
5. При добавлении записи в CE сразу вызывается код в АА-скрипте.
Так CE проверяет все, что там находится. Это может создать лишний таймер. Как это проверить? Через логи и print()
Спойлер// перед добавлением скрипта, запись уже уже должна быть создана в таблице с пустыми [ENABLE] и [DISABLE] {$lua} print('инициализирован "'..memrec.Description..'"') {$asm} [ENABLE] {$lua} print('активирован "'..memrec.Description..'"') {$asm} [DISABLE] {$lua} print('не активирован "'..memrec.Description..'"') {$asm}
6. Если объединить пункты выше и отказаться от таймера, то получится что-то вроде этого.
Спойлер[ENABLE] {$lua} process_name = 'Tutorial-i386.exe' -- Название процесса record_name = 'Активирующий скрипт' -- Название записи getAutoAttachList().add(process_name) -- Автоподключение function onOpenProcess(process_id) -- Обработчик подключения -- активация record записи getAddressList().getMemoryRecordByDescription(record_name).Active = true end [DISABLE]
9 часов назад, Pitronic сказал:он у меня не добавляется в таблицу вот такая ошибка.
7. Ошибка, очень похоже, связана с названием записи напротив галки. Т.е. она отсутствует.
8. Ну, а как программное разворачивать вложенные читы и активировать их?
Идем в документацию и что-то вроде этого ищем про memoryRecord.Options. Выставляnm Options можно как вручную так и скриптом
Спойлерlocal addressList = getAddressList() local memoryRecord = getAddressList().getMemoryRecordByDescription("Активирующий скрипт") memoryRecord.Options = "moHideChildren, moActivateChildrenAsWell, moAllowManualCollapseAndExpand" memoryRecord.Active = true --[[ Options: String set - a string enclosed by square brackets filled with the options seperated by a comma. Valid options are: moHideChildren, moActivateChildrenAsWell, moDeactivateChildrenAsWell, moRecursiveSetValue, moAllowManualCollapseAndExpand, moManualExpandCollapse, moAlwaysHideChildren]]--
СпойлерБолее полно все функции описаны в документации
Хотя там не все есть. Например, про "memrec" внутри уже созданного АА-скрипта. Тогда не нужно использовать local memoryRecord = getAddressList().getMemoryRecordByDescription("Активирующий скрипт"), а сразу memrec и с ним работать.
-
Какую логику работы скриптов хотим получить?
Вариант1
1. Если нажали на галку в таблице CE, то делать автоматически аттач к процессу?
2. Как только подключился процесс, то активировать другую галку?Или вариант2
1. Чтобы нажали на галку и начался поиск процесса
2. Как только процесс найден, то все вложенные записи под этой же галкой показались(развернулись)?
Критерий "Как правильно написать этот скрипт для табличного варианта?" мне пока не совсем понятен.
-
12 минут назад, Pitronic сказал:
Ещё вопрос если можно чекбокс окрасить в таблице, разве нет похожего Lua скрипта для чекбоксов?
То, что ДаркБайт делал, это квадратик нарисовал и пару палочек в нем в виде крестика. Это не на Lua, а на Lazarus - то, на чем CE написан.
На Lua можно в теории сделать любой чек-бокс. Только готового скрипта нет и это не быстро сделать. И это творческий процесс. Если очень надо поспрашивай на форуме Cheat Engine. Я думаю, будут энтузиасты и они подскажут. Может быть и что-то готовое уже есть.
-
Google пишет, что этот компонент системный. Поэтому Dark Byte сделал финт - квадратик с крестиком, т.е. сделал свой вариант чек-боксаа и может красить его как угодно
СпойлерСкорее всего, только свой компонент делать. Я бы поигрался с Image компонентом. В нем менять картинки этого чекбокса по обраотчику.
Все это дело не простое и творческое. Кнопку может и сделаешь визуально в редакторе и кликаться будет, и меняться картинка и label-надписи будут рядом. Но еще предстоит внедрить в саму форму, где будешь использовать. Выровнять. Все эти клики связать. Либо вручную в этом визуальном редакторе CE, либо программно. В целом это все творческий и долгий процесс создания внешней оболочки.
-
Это решение не тестировал и не могу судить насколько оно удобно или применимо. Может быть ситуация, когда надо постоянно проверять подключён процесс или нет. Это можно делать тем же таймером или перед активаципй опций читов. В общем просто вариант из сочинений на тему "как бы подключился к процессу".
-
14 часов назад, Partizan сказал:
#4
Спойлерattach_prosess = 'process.exe' getAutoAttachList().add(attach_prosess) is_reconnect_process_not_allowed = false -- Обработчик подключения function onOpenProcess(process_id) if is_reconnect_process_not_allowed then -- сообщения с текстом "перезапустите таблицу/трейнер" --messageDialog(text, type, buttons...) : pops up a messagebox with a specific icon/sound with the specified buttons (mbok, mbyes, ....) --messageDialog(title, text, type, buttons...): ^ but adds a custom title --messageDialog(text) : shows an information dialog with the text return end getAutoAttachList().remove(attach_prosess) is_reconnect_process_not_allowed = true end
- 1
-
А какая ошибка выскакивает?
Я проверил старый скрипт на CE 7.2. Ошибки нет. Процесс находится и подключение к нему происходит.
Спойлерlocal timerAutorun = createTimer(nil, true) timerAutorun.Interval = 1000 timerAutorun.OnTimer = function () if (getOpenedProcessID() ~= getProcessIDFromProcessName("Tutorial-i386.exe")) then OpenProcess("Tutorial-i386.exe") end end
-
С CheatEngine форума.
Самая интересная конструкция в скрипте
compactmenuitem.Caption = state and 'Compact View Mode' or 'Full View Mode'
Здесь-то Caption-то — строка. Ну, а вот Lua такой язык программирования, что позволяет булевые значения и строки вместе писать, и возвращать строки.
-
Да не за, что. Поправлю себя, что можно еще и
UDF1.borderStyle = 'bsDialog' -- или другое свойство, на скриншоте (bsSizeable и т.п.) -- Для чтения print(UDF1.borderStyle)
-
1 час назад, Pitronic сказал:
если через создать форму это и есть udf 1 и там нет разрешить изменять размер окна,
Тогда только шаг3
-
Спойлер
Шаг 1. Снять галку
Шаг2. Нажать на кнопку "Пользовательский дизайн"
Шаг3. выбрать BorderStyle = bsSingle чтобы размер формы не менялся
Шаг4. Закрыть дизайнер форм копкой на шаге2.
Шаг5. Сгенерировать exe
Не проверял, но должно работать.
-
14 часов назад, Antonshka сказал:
Интересно как на С++ проверяется валидность значения адреса.
Через WinAPI проверять доступные регионы памяти
СпойлерПодробно в справочнике по win api. Или Рихтер. "Глава 13. Архитектура памяти в Windows"
-
В 25.05.2022 в 2:18 PM, botmaker сказал:
Было бы достаточно алгоритма, мне не удается его понять до сих пор.
Проекция точки на экран на SlimDX
var viewProj = mMainCamera.View * mMainCamera.Projection; var vp = mDevice.ImmediateContext.Rasterizer.GetViewports()[0]; var screenCoords = Vector3.Project(worldSpaceCoordinates, vp.X, vp.Y, vp.Width, vp.Height, vp.MinZ, vp.MaxZ, viewProj);
Не знаю, оно или нет. Надо в API смотреть. Просто загуглил.
На unity это одной функцией Camera.WorldToScreenPoint
Разбираться надо. Времени нет.
Предложения по форуму 2.0
in О работе сайта и форума
Опубликовано
Определиться, что именно тебе интересно и чем ты сам хочешь заниматься.
Если самому нечем заниматься. то это вопрос к самому себе.
Если же есть чем заниматься, но не дают, то это вопрос к админам. Лучше об этом сообщать (в тех же пожеланиях).
Я бы смотрел в строну образования. Gamehacklab[RU] может мотивировать в изучении программирования и тем самым в выборе IT-специальности.
Дать понять. что это за ресурс.
1) Для тех, кто просто ищут готовые читы, трейнеры
2) Для тех, кто заказывает и продает услуги по читам.
3) Для тех, кто учиться.
Мне кажется, что третья категория совсем неочевидная. Человек, не понимает. Видит форум. Разделы. Первую тему, которую он создаст это "как найти готовые читы или трейнер". Ему скажут или сам делай и учись (смотри курсы), или ступай в заказы. И нет такого, чтобы была мотивация разобраться в том, как самому написать скрипт. Зато есть мотивация — выложи готовое и скачай готовое. Т.е. то, что лежит на видном месте: готовые трейнеры, готовые таблицы, готовые скрипты. А еще категории форумов неоднозначно сформулированны о том, что в них обсуждается. То ли категория для вопросов, как читы готовые найти или категория о том, кто их смог бы помочь сделать. В категории должно быть все-таки очевидно написано, какие темы там будут либо дайте готовое, либо я буду учиться и нужна помощь. В общем такое видение у меня.