Как да сетна velocity в touch?

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Отговори
Потребителски аватар

Автор на темата
mi0 nope
AMXX Скриптър
AMXX Скриптър
Мнения: 114
Регистриран: 09 дек 2016, 22:02
Се отблагодари: 28 пъти
Получена благодарност: 17 пъти
Години: 25
Контакти:

Как да сетна velocity в touch?

Мнение от mi0 nope » 08 юли 2019, 02:25

Здравейте драги съскриптъри. Преди 4-5 месеца попаднах на нещо, което ме изнерви.
Идеята беше да Сетна някакво си Velocity в hook на touch. Проблема е, че изобщо не се получи, така де получи се, но аз не помръднах.
Плъгина си ми сетваше Velocity и аз не мърдах, опитах да hook-на touch-а през engine, fakemeta, ham и reapi и пак нищо не стана Velocity-то го сетвах с Fakemeta и reapi(и в двата случея сетвам, след това гетвам наново и го принтвам и е точно толкова колкото съм го сетнал). Сетвах във Post и в Pre, спирах toucha и го оставях да продължи, но в никакъв случай не можех да накарам плъгина да ме помръдне. Докато след 3-4 часа мъчене и много различни опитани неща някак успях да го подкарам. Идеята е, че загубих кода и сега нямам никаква идея как да го пресъздада. Ако може някой от вас да помогне...
Примерен код, който не работи...

Код: Избери всички

#include <amxmodx>
#include <reapi>
#include <hamsandwich>

public plugin_init()
{
	register_plugin("test", "0.1", "mi0")

	RegisterHam(Ham_Touch, "player", "OnPlayerTouch")
}

public OnPlayerTouch(id, iSurface)
{
	new Float:fVel[3]
	fVel[2] = 265.0
	set_entvar(id, var_velocity, fVel)
}

Потребителски аватар

JackEyedJones
Потребител
Потребител
Мнения: 220
Регистриран: 10 сеп 2018, 17:26
Местоположение: Plovdiv, Bulgaria, Europe, Entire World
Се отблагодари: 3 пъти
Получена благодарност: 36 пъти
Години: 26
Контакти:

Как да сетна velocity в touch?

Мнение от JackEyedJones » 08 юли 2019, 08:56

Така написано, не се разбира дали искаш да настроиш скорост на даден обект, скоростта му да се променя ако докосне друг ? Или искаш да променя твоята скорост като докоснеш нещо. Не е напълно ясно.

Потребителски аватар

Autumn Shade EA\DICE
Developer
Developer
Мнения: 138
Регистриран: 14 мар 2019, 13:20
Се отблагодари: 20 пъти
Получена благодарност: 53 пъти

Как да сетна velocity в touch?

Мнение от Autumn Shade EA\DICE » 08 юли 2019, 10:25

В зависимост какво искаш да постигнеш, имаш няколко варианта:
set_user_maxspeed - api/fun/set_user_maxspeed
fakemeta pev(id, pev_maxspeed, _) - api/fakemeta_const
fakemeta pev(id, pev_velocity, _) - api/fakemeta_const
entity_set_vector - api/engine/entity_set_vector

А колкото до touch-а, аз бих използвал engine, естествено, в зависимост отново какво искаш да постигнеш, ето един пример с trigger_multiple:

Код: Избери всички

#include <amxmodx>
#include <engine>

public plugin_init() {
    register_touch("trigger_multiple", "player", "fwdPlayerTouchTriggerMultiple");
}

public fwdPlayerTouchTriggerMultiple(entity, id) {
    if(is_user_alive(id) && !entity_get_int(entity, EV_INT_iuser1)) {
       static szTargetName[32];
       entity_get_string(entity, EV_SZ_targetname, szTargetName, charsmax(szTargetName));
       
       entity_set_int(entity, EV_INT_iuser1, 1);
       
       client_print(id, print_chat, "Touched %s", szTargetName);
    }
}

Потребителски аватар

<VeCo>
AMXX Скриптър
AMXX Скриптър
Мнения: 141
Регистриран: 28 яну 2019, 19:01
Се отблагодари: 8 пъти
Получена благодарност: 64 пъти
Години: 24
Контакти:

Как да сетна velocity в touch?

Мнение от <VeCo> » 08 юли 2019, 18:22

Не знам какво искаш да направиш, но това, което си дал, работи.

Енджина извиква touch само когато активно се "буташ" в някой обект, не просто като седиш до него.
В твоя случай, когато се бутнеш в друг играч като ходиш към него, той ще полети.

Ако очакваш ти да полетиш, трябва някой тебе да те бутне. :D



Но е възможно, ако пробваш върху солидни brush ентитита, collision checking-a на играта да те ебава и touch-a в случая да се извиква твърде рано, за да промениш velocity и играта припокрива това, което ти задаваш.
Ако ти се занимава с пускане/гасене на prethink за 1 frame, това би ти свършило работа... :shok: но може би има и по-свестен начин..
:pepo_think3:

Потребителски аватар

Автор на темата
mi0 nope
AMXX Скриптър
AMXX Скриптър
Мнения: 114
Регистриран: 09 дек 2016, 22:02
Се отблагодари: 28 пъти
Получена благодарност: 17 пъти
Години: 25
Контакти:

Как да сетна velocity в touch?

Мнение от mi0 nope » 08 юли 2019, 19:29

Знам кога извиква тъча има дебъг в чата... Не работи при мен, стига, сетва и пак нема ефекти... И да за сега е в pre think-а, което беше временното решение миналия път. Чесно нямам никаква идея какво бъркам и дали не е от regamedll-а, а ти си го пробвал и работи?? Благодаря за насоките като се прибера, ще тествам, до тъча и аз бих ползвал Engine, просто защото няма да ми е нужно да проверявам какво какво пипа.

Потребителски аватар

<VeCo>
AMXX Скриптър
AMXX Скриптър
Мнения: 141
Регистриран: 28 яну 2019, 19:01
Се отблагодари: 8 пъти
Получена благодарност: 64 пъти
Години: 24
Контакти:

Как да сетна velocity в touch?

Мнение от <VeCo> » 08 юли 2019, 19:39

Първо тествах с ботове и player ентити, ако се докосна до тях, политат.

После ползвах това за тест със солиден блок:

Код: Избери всички

#include <amxmodx>
#include <fun>
#include <engine>
#include <hamsandwich>

new change[33],Float:vec[3]
public plugin_init()
{
	register_plugin("test", "0.1", "mi0")
	register_touch("func_wall","player","OnPlayerTouch")
}

public OnPlayerTouch(ent, id)
{
	entity_get_vector(id,EV_VEC_velocity,vec)
	server_print("%.2f %.2f %.2f",vec[0],vec[1],vec[2])
	entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,255.0})
	change[id] = true
}

public client_PreThink(id)
{
	if(change[id])
	{
		entity_get_vector(id,EV_VEC_velocity,vec)
		server_print(">>> %.2f %.2f %.2f",vec[0],vec[1],vec[2])
		//entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,255.0})
		change[id] = false
	}
}
След бутане в блок:

Код: Избери всички

3.05 -19.76 0.00
>>> 3.05 0.00 0.00
Първото е velocity при докосването. В тая функция задавам 255 нагоре.
Второто е velocity от следващия фрейм, изглежда играта припокрива това, което съм задал, за да поправи collision.

Естествено, тоя претинк така не е добра идея, но има начини да го спреш и пуснеш само когато е нужно.
:pepo_think3:

Потребителски аватар

Автор на темата
mi0 nope
AMXX Скриптър
AMXX Скриптър
Мнения: 114
Регистриран: 09 дек 2016, 22:02
Се отблагодари: 28 пъти
Получена благодарност: 17 пъти
Години: 25
Контакти:

Как да сетна velocity в touch?

Мнение от mi0 nope » 08 юли 2019, 20:14

Така и ще направя, ще ползвам най-вероятно Фм, понеже така или иначе го ползвам в плъгина. Виждам резултатите, които са ми известни, много тестове направих и пак няма и следа от променяне на velocity, освен в самия тъч... То добре е заради collision-а ама той не ползва ли сегашното velocity(промененото)
Последна промяна от mi0 nope на 09 юли 2019, 04:48, променено общо 1 път.

Потребителски аватар

<VeCo>
AMXX Скриптър
AMXX Скриптър
Мнения: 141
Регистриран: 28 яну 2019, 19:01
Се отблагодари: 8 пъти
Получена благодарност: 64 пъти
Години: 24
Контакти:

Как да сетна velocity в touch?

Мнение от <VeCo> » 08 юли 2019, 20:29

mi0 написа:
08 юли 2019, 20:14
То добре е заради collision-а ама той не пошзва ли сегашното velocity(промененото)
Би трябвало да взима velocity в началото, няма влияние какво му задаваш след това.
:pepo_think3:

Отговори

Върни се в “Помощ в скриптирането”

Кой е на линия

Потребители, разглеждащи този форум: Няма регистрирани потребители и 2 госта