You are not logged in.
Это нормально, что опкод 05DC: не удаляет память, выделенную под код скрипта?
delete script;
При выгрузке скриптов и в 05DD:
if(script->m_pCodeAry) delete script->m_pCodeAry; delete script;
При этом, скрипт удаляется их всех списков, и доступ к памяти просто теряется.
Last edited by DK22Pac (10-08-2014 09:18)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Исходников все равно нет, чтобы исправить
Offline
Я щас начал переписывать... Сделал так, чтобы память под код удалялась во время перезагрузки или завершения игры (иногда надо, чтоб код сохранялся после завершения скрипта - если делать хук в ексе).
#pragma once #include "Opcodes.h" #include "CustomScript.h" #include "Scripts.h" #include "MemoryManager.h" class CCustomOpcodes { static eOpcodeResult EndCustomThread(CCustomScript *script) { script->RemoveFromList(&CScripts::pActiveScripts); script->RemoveFromCustomList(&CScripts::pCustomScripts); --CScripts::numActiveCustomScripts; delete script; return RET_CONTINUE; } static eOpcodeResult EndCustomThreadNamed(CCustomScript *script) { char *name = &CScripts::space[script->m_pc]; script->m_pc += 8; for(CCustomScript *i = CScripts::pCustomScripts; i; i = i->m_pNextCustom) { if(!strcmp(i->m_acName, name)) { i->RemoveFromList(&CScripts::pActiveScripts); i->RemoveFromCustomList(&CScripts::pCustomScripts); --CScripts::numActiveCustomScripts; delete i; return RET_CONTINUE; } } return RET_CONTINUE; } static void Register() { CScripts::RegisterCustomOpcode(0x05DC, EndCustomThread); CScripts::RegisterCustomOpcode(0x05DD, EndCustomThreadNamed); } };
static void UnloadCustomScripts() { for(CCustomScript *i = pCustomScripts; i; i = i->m_pNextCustom) { i->RemoveFromList(&CScripts::pActiveScripts); i->RemoveFromCustomList(&CScripts::pCustomScripts); --CScripts::numActiveCustomScripts; delete i; } CMemory::DeleteScriptsCode(); CScripts::pCustomScripts = NULL; }
Не знаю, даст ли Alien потом согласие на релиз
Вот кстати как сделал хандлинг опкодов.
eOpcodeResult ProcessOneCommand() { unsigned short id = *(unsigned short *)&CScripts::space[m_pc] & 0x7FFF; if(*(unsigned short *)&CScripts::space[m_pc] & 0x8000) m_bNegFlag = true; else m_bNegFlag = false; m_pc += 2; // check for user (default replacement) opcodes here for(auto i = CScripts::defaultOpcodeReplacement.begin(); i != CScripts::defaultOpcodeReplacement.end(); i++) { if((*i).opcodeId == id) return (*i).opcodeFunc(this); } // switch(id) { case 0x004C: // GOTO_IF_TRUE Collect(1); if(m_bCompareFlag) JumpTo(CScripts::params.intParam[0]); return RET_CONTINUE; case 0x004D: // GOTO_IF_FALSE Collect(1); if(!m_bCompareFlag) JumpTo(CScripts::params.intParam[0]); return RET_CONTINUE; case 0x0002: // GOTO Collect(1); JumpTo(CScripts::params.intParam[0]); return RET_CONTINUE; case 0x0050: // GOSUB Collect(1); m_aRetAddr[m_nCountRet++] = m_pc; JumpTo(CScripts::params.intParam[0]); return RET_CONTINUE; default: if(id >= CUSTOM_OPCODES_START_ID) { if(CScripts::customOpcodes[id - CUSTOM_OPCODES_START_ID]) return CScripts::customOpcodes[id - CUSTOM_OPCODES_START_ID](this); else { Error("Incorrect opcode ID: %04X", id); return RET_UNDEFINED_COMMAND; } } return CScripts::defaultOpcodeHandlers[id / 100](this, id); } }
Last edited by DK22Pac (10-08-2014 10:53)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Я думаю он не будет против, тем более, если он уже не занимается cleo. А лучше еще будет, если ты подправишь cleo для Vice City. Там есть досадный баг, который "мешает жить". Вообщем, если запустить новую игру, а потом еще раз новую то вылет...
I know everything and nothing...
Offline
Возможно займусь и Вайсом, но только после того, как это завершу.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Тогда сразу могу сказать, что я еще заметил на текущих версиях, пока что вот это: если в мейне используешь call_scm функцию то вылет, она работает только в cleo скриптах (это относится как для Вайс так и для III). Неплохо бы добавить опкоды по работе с битами, а то писать в каждом скрипте asm вставки..., а и еще опкод, который получает офсет метки и офсет переменной (и тут тоже чтоб и в мейне желательно работало, в Вайсе не робит).
I know everything and nothing...
Offline
Наверное потому что информация о функции находится в дополнительном буфере в структуре CLEO-скрипта.
Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?
По CLEO - уже вроде как написал основу, осталось все опкоды перенести. Скрипты уже работают
Last edited by DK22Pac (10-08-2014 17:08)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Сделал опкоды из VC и опкоды для отрисовки текста.
{$CLEO} 05F7: 0@ = label @text offset 05F9: 1@ = 0xAAAAAAAA AND 0xFFFF while true wait 0 0602: printf 0@ at 200.0 200.0 scale 1.4 2.0 color 255 0 0 255 style 0 shadow 0 params 0xAAAAAAAA 0xFFFF 1@ end :text hex "0x%X" 20 "AND" 20 "0x%X" 20 "=" 20 "0x%X" 00 end
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?
С утра в понедельник голова плохо работает, поэтому уточню: что это за ошибка? Когда и при каких условиях она возникает?
Offline
DK22Pac wrote:Кстати, вопрос к Seemanу - как избавиться от ошибки "File contains no information"? Как SB получает эту информацию из asi?
С утра в понедельник голова плохо работает, поэтому уточню: что это за ошибка? Когда и при каких условиях она возникает?
После того, как заменил CLEO.asi. Появляется постоянно, даже если просто вкладку переключить. Ещё из-за этого нельзя менять параметры в настройках (вылетает эта ошибка, и невозможно сохранить изменения).
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Не знаю, пока что такой цели нет.
Осталось сделать опкоды поиска педов/транспорта/обьектов.
Scm-функции теперь должны работать в майне, правда, проверить пока что не могу.
Last edited by DK22Pac (12-08-2014 11:52)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Наверное. Я код написал уже, но проверяю только на скриптах.
Опкоды уже все написал, осталось проверить их.
Также добавил возможность использовать строки в опкодах с переменным кол-вом параметров (т.е. можно будет передавать строки в scm-функциях).
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
DK22Pac
если я правильно понял, о чем речь, тебе нужно добавить информацию о версии файла к твоей asi (.dll) Это сообщение, видимо, стандартное виндовское, потому что я его не вывожу специально.
Санник проверяет версию CLEO.asi, чтобы предложить обновление в случае чего. Надо будет переделать эту функцию, чтобы ошибка не выводилась.
Offline
Увы, с моей поломанной MSVS не удается подключить ресурс к проекту. Программы, которые работают уже со скомпилированным файлом, тоже не хочется использовать.
Ещё такой косяк - если нажать на значок CLEO внизу, появится окно установки CLEO вместе с этой ошибкой. После этого вообще ничего нельзя будет сделать, даже закрыть сам Санни.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Попробуй удалить файл 'tools\CLEO4\SA\CLEO.asi'
Offline
DK22Pac
можешь скинуть мне проблемный cleo.asi, чтобы я смог воспроизвести ту ошибку и исправить ее?
Offline
DK22Pac
А планируется ли добавление работы с ini? Этого чертовски не хватает в трешке и вайсе
P.S.
cleo для Vice City. Там есть досадный баг, который "мешает жить". Вообщем, если запустить новую игру, а потом еще раз новую то вылет
Охох спасибо за инфу! Я уже думал смириться и просто убрать пункт "новая игра" в своем моде, т.к. никак не мог понять, какая же проблема в моем мэйне крашит игру при рестарте.
Теперь реально - вся надежда на DK22Pac!
Last edited by Shag (06-09-2014 23:02)
Offline
Работу с ini частично можно реализовать и на старом CLEO.
(версия для GTA 3)
{$CLEO .cs} const dll = 0@ LoadLibrary = 4@ FreeLibrary = 5@ GetProcAddress = 6@ GetPrivateProfileInt = 7@ Hour = 8@ Minute = 9@ end 05E0: LoadLibrary = read_memory 0x61D458 size 4 virtual_protect 0 05E0: FreeLibrary = read_memory 0x61D460 size 4 virtual_protect 0 05E0: GetProcAddress = read_memory 0x61D45C size 4 virtual_protect 0 05F5: call_scm_func @getLabelOffset 1 label @KERNEL32 store_to 1@ // DllName 05E2: call_function LoadLibrary num_params 1 pop 0 file_mame 1@ ret_to dll if dll <> 0 then 05F5: call_scm_func @getLabelOffset 1 label @GETPRIVATEPROFILEINTA store_to 1@ // ProcName 05E2: call_function GetProcAddress num_params 2 pop 0 proc_mame 1@ h_module dll ret_to GetPrivateProfileInt if GetPrivateProfileInt <> 0 then 05F5: call_scm_func @getLabelOffset 1 label @MAIN store_to 1@ // AppName 05F5: call_scm_func @getLabelOffset 1 label @HOUR store_to 2@ // KeyName 05F5: call_scm_func @getLabelOffset 1 label @FILE store_to 3@ // FileName 05E2: call_function GetPrivateProfileInt num_params 4 pop 0 file_mame 3@ n_default 0 key_mame 2@ app_name 1@ ret_to Hour 05F5: call_scm_func @getLabelOffset 1 label @MINUTE store_to 2@ // KeyName 05E2: call_function GetPrivateProfileInt num_params 4 pop 0 file_mame 3@ n_default 0 key_mame 2@ app_name 1@ ret_to Minute end 05E1: call FreeLibrary num_params 1 pop 1 h_module dll end while true 0001: wait 500 ms 00C0: set_current_time Hour Minute end 05DC: end_custom_thread :KERNEL32 hex "kernel32.dll" 00 end :GETPRIVATEPROFILEINTA hex "GetPrivateProfileIntA" 00 end :MAIN hex "MAIN" 00 end :HOUR hex "Hour" 00 end :MINUTE hex "Minute" 00 end :FILE hex ".\CLEO\ReadIni.ini" 00 end :getLabelOffset // Thanks to ThirteenAG { Example: 05F5: call_scm_func @getLabelOffset 1 label @lbl store_to 0@ } if 0@ <> 0 then 05EC: 1@ = current_thread_pointer 1@ += 0x98 05E0: 1@ = read_memory 1@ size 4 virtual_protect 0 000C: 1@ -= 0@ else 1@ = 0 end 05F6: ret 1 1@
Offline
ZeroTen, спасибо конечно, но надеюсь DK22Pac сможет превратить это в один опкод...
Это и не нужно совать в Клео, ибо данный код - отличный пример использования функции с длл'ки.
В WinAPI есть прекрасные нативные функции для работы с ини файлами - это GetPrivateProfileString и WritePrivateProfileString. Добавить их в КЛЕО с помощью с++ очень просто
Offline
После потери своих же исходников для CLEO III, желания писать "по новой" совсем не было... Но вчера что-то перевернулось.
Сейчас уже написал основу, - без дополнительных опкодов, FXT и текста в меню.
Упростил работу с кастомными опкодами до минимума - есть общее пространство опкодов (и стандартных, и кастомных), - можно регистрировать опкод с любым id, включая стандартные.
eOpcodeResult CScript::ProcessOneCommand() { *game.Scripts.pNumOpcodesExecuted += 1; unsigned short id = *(unsigned short *)&game.Scripts.Space[this->m_dwIp] & 0x7FFF; if(*(unsigned short *)&game.Scripts.Space[this->m_dwIp] & 0x8000) this->m_bNotFlag = true; else this->m_bNotFlag = false; this->m_dwIp += 2; // check for custom opcodes here if(Opcodes::functions[id]) { // call custom opcode LOGL(LOG_PRIORITY_OPCODE_ID, "%s custom opcode %04X", this->m_acName, id); return Opcodes::functions[id](this); } else if(id >= CUSTOM_OPCODE_START_ID) { LOGL(LOG_PRIORITY_ALWAYS, "Error (incorrect opcode): %s, %04X", this->m_acName, id); Error("Incorrect opcode ID: %04X", id); return OR_UNDEFINED; } // call default opcode LOGL(LOG_PRIORITY_OPCODE_ID, "%s opcode %04X", this->m_acName, id); eOpcodeResult result = game.Scripts.OpcodeHandlers[id / 100](this, id); return result; }
#include "CustomOpcodes.h" #include "Game.h" #include "OpcodesSystem.h" void CustomOpcodes::Register() { Opcodes::RegisterOpcode(0x0002, GOTO); Opcodes::RegisterOpcode(0x004C, GOTO_IF_TRUE); Opcodes::RegisterOpcode(0x004D, GOTO_IF_FALSE); Opcodes::RegisterOpcode(0x0050, GOSUB); } eOpcodeResult CustomOpcodes::GOTO(CScript *script) { script->Collect(1); script->JumpTo(game.Scripts.Params[0].nVar); return OR_CONTINUE; } eOpcodeResult CustomOpcodes::GOTO_IF_TRUE(CScript *script) { script->Collect(1); if(script->m_bCondResult) script->JumpTo(game.Scripts.Params[0].nVar); return OR_CONTINUE; } eOpcodeResult CustomOpcodes::GOTO_IF_FALSE(CScript *script) { script->Collect(1); if(!script->m_bCondResult) script->JumpTo(game.Scripts.Params[0].nVar); return OR_CONTINUE; } eOpcodeResult CustomOpcodes::GOSUB(CScript *script) { script->Collect(1); script->m_aGosubAddr[script->m_nCurrentGosub++] = script->m_dwIp; script->JumpTo(game.Scripts.Params[0].nVar); return OR_CONTINUE; }
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline