SDKCall проблема
| |
serm
|
Дата: Пятница, 08.08.2014, 08:16:21 | Сообщение # 1 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Здравствуйте . У меня проблема возникла с SDKCall
Нужно получить позицию attachment
код Код #pragma semicolon 1
#include <sourcemod> #include <sdktools> #include <cstrike> #include <sdkhooks>
new Handle:hGameConf, Handle:hTest, Handle:hLookupAttachment;
public OnPluginStart(){ hGameConf = LoadGameConfigFile("plugin.offests"); StartPrepSDKCall(SDKCall_Entity); PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, "GetAttachment"); PrepSDKCall_AddParameter(SDKType_PlainOldData , SDKPass_Plain); PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKPass_Plain); hTest = EndPrepSDKCall(); StartPrepSDKCall(SDKCall_Entity); PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, "LookupAttachment"); PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer); PrepSDKCall_SetReturnInfo(SDKType_PlainOldData, SDKPass_Plain); hLookupAttachment = EndPrepSDKCall(); RegConsoleCmd("test",test); } public Action:test(client,Args){ new Float:f_pos[3], Float:f_ang[3];
SDKCall(hTest, client, SDKCall(hLookupAttachment, client, "muzzle_flash"), f_pos, f_ang); // SDKCall(hTest, client, 12, f_pos, f_ang); // Если у когото из вас ос windows раскомментируйте эту строчку PrintToChatAll("%f %f %f", f_pos[0], f_pos[1], f_pos[2]); }
gamedata
Код "Games" { "cstrike" { "Offsets" { "GetAttachment" { "windows" "204" "linux" "205" } } "Signatures" { "LookupAttachment" { "library" "server" "linux" "@_ZN14CBaseAnimating16LookupAttachmentEPKc" } } } }
Что в итоге у меня либо сервер крашится либо получаю позицию 0.0 0.0 0.0
Я уже пробовал Код PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKType_QAngle, SDKPass_ByValue); Т.к. мне должно вернуться 2 значения float:f_pos[3] float:f_ang[3]
Но все так же краш сервера .
Использую Код GetAttachment( int attachment, Vector &origin, QAngle &angles );
Оффсеты и сигнатуры 100% правильные .
Помогите кто может .Добавлено (08.08.2014, 08:16:21) --------------------------------------------- Ну так что , знает ктонибудь ?
|
|
| |
BarD
|
Дата: Пятница, 08.08.2014, 08:57:21 | Сообщение # 2 |
|
Сообщений: 943
Репутация: 137 [ +/- ]
|
|
Неа, извини. Вообще не понимаю, о чем тут речь...
|
|
| |
serm
|
Дата: Пятница, 08.08.2014, 10:53:30 | Сообщение # 3 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Ужас никто нигде помочь не может На am не помогают тут я думаю тоже никто не работал с sdkcall Как выкручиваться не знаю .
Может кто знает альтернативную функцию ? Чтобы можно было получить позицию Attachment ну или Bone модели ?
|
|
| |
Darkeneez
|
Дата: Пятница, 08.08.2014, 12:43:56 | Сообщение # 4 |
|
Сообщений: 221
Репутация: 18 [ +/- ]
|
|
Цитата serm ( ) Ужас никто нигде помочь не может Переводчиком умеешь пользоваться? Суть проблемы выкладываешь сюда https://forums.alliedmods.net/forumdisplay.php?f=107
|
|
| |
serm
|
Дата: Пятница, 08.08.2014, 12:56:03 | Сообщение # 5 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Цитата Darkeneez ( ) Переводчиком умеешь пользоваться? Суть проблемы выкладываешь сюда https://forums.alliedmods.net/forumdisplay.php?f=107 Да я вроде и сам анг. знаю вот тема почитай https://forums.alliedmods.net/showthread.php?p=2179905Добавлено (08.08.2014, 12:56:03) --------------------------------------------- Там тоже жмутся люди особо помочь не стараются .
|
|
| |
sssw
|
Дата: Пятница, 08.08.2014, 13:20:15 | Сообщение # 6 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Кроме нулей получить нельзя. Если так нужны координаты нужно вызывать кадры физики из client.dll заставить движок передавать на него дельту а потом с него рипать значение.
Сообщение отредактировал sssw - Пятница, 08.08.2014, 13:27:44 |
|
| |
serm
|
Дата: Пятница, 08.08.2014, 14:54:22 | Сообщение # 7 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Цитата sssw ( ) Кроме нулей получить нельзя. Если так нужны координаты нужно вызывать кадры физики из client.dll заставить движок передавать на него дельту а потом с него рипать значение. Надеюсь что ты понял мой выше поставленный вопрос . Мне нужно именно получить координаты атачмента . В движке есть масса функций GetAttachment думаю самая разумная из них это CBaseAnimating т.к. она связанна напрямую с анимациями . Далее я беру сигнатуру этой функции , в данный момент я могу получить сигнатуру linux . win сигнатуру я не умею правильно выписывать . Вот сигнатура функции Код CBaseAnimating::GetAttachment(int, Vector &, QAngle &) _ZN14CBaseAnimating13GetAttachmentEPKcR6VectorR6QAngle
Подключив все это в gamedata я вызываю sdkcall и вроде бы должен получить ответ но увы чаще всего идет краш .
Я смотрел массу примеров реализации на c++ через расширения sourcemod там все довольно просто они вычисляют это все через matrix которая подключается вместе с классами фиг знает где (Скорее всего с самом sourcemod классе)
Ты говоришь вызывать кадры физики client.dll для чего ? Ведь сервер обрабатывает все динамические анимации внутри себя а не на клиенте (За исключением ragdoll - как то так) . Следовательно мне проще будет получить координаты из server.dll чем с клиента .
И в конец я же могу например через sdkcall взять координаты игрока ... его угол обзора ... И все вызвать так же через сигнатуры и все работает , почему же здесь такая заноза .
Еще я видел пример в c++ расширении что вызывается функция как то так Код GetAttachment(int, Vector &) То есть без направления . Но функциях в server.dll этого не нашел .
Так вот я ссылаюсь на то что при вызове функции sdkcall мне должно вернуть 2 значения , а принять можно только одно Код PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKPass_ByValue); Я пробовал так Код PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKType_QAngle, SDKPass_ByValue);
Но я думаю так нельзя, да и сервер падает .
Так вот теперь скажите может где то я не так понимаю , или что то не правильно в коде ?
Сообщение отредактировал serm - Пятница, 08.08.2014, 14:55:51 |
|
| |
sssw
|
Дата: Пятница, 08.08.2014, 15:13:03 | Сообщение # 8 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Я тоже побывал делать это для себя но провалился. А для чего анимация апартаментов на сервере? Поверь её там просто нету (возможно), ну высылал бы сервер координаты аттачьмента вместо информации аттачмента чтобы получилась каша можно передать скорость у будет все ок. (ЗАЧЕМ Я ЭТО НАПИСАЛ ХЗ).
Есть плагин который получает наконечник оружия игрока muzzle посмотри его. (CS:S Laser Tag Plugin)
Так только ShootPosition (. Код "Games" { "cstrike" { "Offsets" { "Weapon_ShootPosition" { "windows" "221" "linux" "222" } } } }
Сообщение отредактировал sssw - Пятница, 08.08.2014, 15:18:42 |
|
| |
serm
|
Дата: Пятница, 08.08.2014, 16:06:41 | Сообщение # 9 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Цитата sssw ( ) Я тоже побывал делать это для себя но провалился. А для чего анимация апартаментов на сервере? Поверь её там просто нету (возможно), ну высылал бы сервер координаты аттачьмента вместо информации аттачмента чтобы получилась каша можно передать скорость у будет все ок. (ЗАЧЕМ Я ЭТО НАПИСАЛ ХЗ).
Есть плагин который получает наконечник оружия игрока muzzle посмотри его. Да я видел такую функцию weapon_shoot_position ? Тоже через сервер sdkcall вызывают .
Нет дело в другом смотри есть такое расширение https://forums.alliedmods.net/showthread.php?t=161331 Его видели походу все скриптеры и я уверен множество людей пытались такое сделать .
Дело в том что там используются все эти функции GetAttachment и GetBonePosition вот , на видео ясно видно что лучи у vortigaunt Исходят прямо из attachment на модели (Я проверял через model viewer) ... Следовательно эту позицию вытянуть можно с сервера . http://www.youtube.com/watch?v=HCXe5Z0uWL0#t=143 Вот этот участок видео .
Ну а можно ли например создать гранату weapon_grenade или какой-нибудь другой проп . Приаттачить (SetAttachment) ее к модели и например попытаться получить координату этой гранаты ? Или как-нибудь еще ?Добавлено (08.08.2014, 15:24:47) --------------------------------------------- Даа я видел этот плагин , но для этого есть отдельная функция и сигнатура Добавлено (08.08.2014, 15:25:42) --------------------------------------------- Скажи sssw ты пробовал работать с sdkcall ? Добавлено (08.08.2014, 16:06:41) --------------------------------------------- Сейчас копался в c++ исходниках мода того . Там я заметил часто упоминается функция MatrixGetColumn Проверил , походу MatrixGetColumn возвращает Float значение (как бы по частям) позицию . Т.к. в исходниках используется вот эта функция Код Vector columns[3]; int i;
for ( i = 0; i < 3; i++ ) { MatrixGetColumn( matrix, i, columns[i] ); } Получают они положение attachment Вот сама функция и сигнатура Код MatrixGetColumn(matrix3x4_t const&, int, Vector &) // matrix3x4_t какое-то значение // int это переменная x y или z // Vector соответственно часть позиции в значении Float
_Z15MatrixGetColumnRK11matrix3x4_tiR6Vector
Так вот я посмотрел matrix3x4_t на valve developer там ничего интересного нет только описание общей функции MatrixGetColumn ...
Может кто-нибудь знает что за переменная matrix3x4_t ??
|
|
| |
sssw
|
Дата: Пятница, 08.08.2014, 16:22:42 | Сообщение # 10 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
http://www.gamedev.ru/code/articles/faq_matrix_quat#chto_takoe_matritsa_
Сообщение отредактировал sssw - Пятница, 08.08.2014, 16:23:09 |
|
| |
serm
|
Дата: Пятница, 08.08.2014, 16:29:09 | Сообщение # 11 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Цитата sssw ( ) http://www.gamedev.ru/code/articles/faq_matrix_quat#chto_takoe_matritsa_ Ох и что же с ней делать тогда . Что туда заносить index attachment и index клиента ... Или что
|
|
| |
sssw
|
Дата: Пятница, 08.08.2014, 16:32:31 | Сообщение # 12 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Цитата serm ( ) matrix3x4 Посмотри внимательней ведь лучи это tmpEntity и там уже должен быть готовый отсылаемый Vector. просто посмотри как его получают.
|
|
| |
serm
|
Дата: Пятница, 08.08.2014, 16:45:31 | Сообщение # 13 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Цитата sssw ( ) Посмотри внимательней ведь лучи это tmpEntity и там уже должен быть готовый отсылаемый Vector. просто посмотри как его получают. Код Vector hand; GetAttachment(VORTIGAUNT_LEFT_CLAW, hand); VORTIGAUNT_LEFT_CLAW это string значение left_hand - название аттачмента Vector hand Это тоже самое что и Float:hand[3] Далее Код te->BeamPoints(filter, 0, &hand, &tr.endpos, m_nBeamLaser, 0, 0, 0, 0.5f, 5.0f, 10.0f, 0, 17.0f, 100, 255, 100, 255, 20); hand Что еще раз подтверждает hand это позиция
Далее по ветке я смотрю Код //----------------------------------------------------------------------------- // Purpose: Returns the world location and world angles of an attachment // Input : attachment index // Output : location and angles //----------------------------------------------------------------------------- bool CAnimating::GetAttachment ( int iAttachment, Vector &absOrigin, QAngle &absAngles ) { matrix3x4_t attachmentToWorld;
bool bRet = GetAttachment( iAttachment, attachmentToWorld ); MatrixAngles( attachmentToWorld, absAngles, absOrigin ); return bRet; } Добавлено (08.08.2014, 16:45:31) ---------------------------------------------
Код MatrixAngles(matrix3x4_t const&, Quaternion &, Vector &) _Z12MatrixAnglesRK11matrix3x4_tR10QuaternionR6Vector https://code.google.com/p/sourcemod-npc-in-css/source/browse/Monster/npc_vortigaunt.cpp#1234
|
|
| |
sssw
|
Дата: Пятница, 08.08.2014, 16:47:16 | Сообщение # 14 |
|
Сообщений: 123
Репутация: 14 [ +/- ]
|
|
Сделай своё расширение или нужно чтобы всё-всё было в плагине? Я бы просто сделал простое расширение для своего плагина. Кстати это можно применить в smac_wallhack для повышение точности, правда CPU расплавиться.
Сообщение отредактировал sssw - Пятница, 08.08.2014, 16:49:43 |
|
| |
serm
|
Дата: Пятница, 08.08.2014, 17:04:44 | Сообщение # 15 |
|
Сообщений: 137
Репутация: 7 [ +/- ]
|
|
Цитата sssw ( ) Сделай своё расширение или нужно чтобы всё-всё было в плагине? Я бы просто сделал простое расширение для своего плагина. Я бы и не против но я еще не достаточно умен для этого .
Я уже попутно начал делать расширение . Я уже скачал Microsoft Visual Studio Настроил его . Подключил все нужные библиотеки . Проверил работоспособность скомпилировав чужое расширение . Все работает на ура .
Первая проблема . Все объявленные функции в расширении должны где-то быть расписаны . Так же как и в sourcemod . Код
public OnPluginStart(){ StartFunction(); // Она должна быть где-то прописана }
Так же и в c++ Получается нужно найти эту функцию или класс и также подключить #include На данный момент я проверил
Код Vector absOrigin; Vector absAngles; matrix3x4_t attachmentToWorld; MatrixAngles( attachmentToWorld, absAngles, absOrigin ); // Нужно найти класс и подключить
Но я не нашел эту функцию вообще в том моде (Проект) http://vk.cc/2Rf0eY (Короткая ссылка)
Добавлено (08.08.2014, 17:03:10) --------------------------------------------- А чем smac wallhak поможет ???
Добавлено (08.08.2014, 17:04:44) --------------------------------------------- sssw Умеешь на c++ кодить ? Если да то напиши мне ,я мог бы заплатить за готовое расширение (Сколько нынче это стоит 200 или 500 или сколько я просто не знаю)?
Сообщение отредактировал serm - Пятница, 08.08.2014, 17:09:06 |
|
| |
|