Jak pobrać dynamiczny IN_USE
GT Team
28.04.2013
Otóż chcę zrobić, by gracz, który jest blisko wieżyczki mógł "podnieść ją" naciskając RAZ klawisz "E". A mógł ją upuśćić ( lecz nie w miejscu, gdzie ono jest zablokowane ) naciskając DRUGI RAZ klawisz "E".
Mam taki kod:
new iTime[33]; public client_PreThink(id) { if(!is_user_alive(id) || is_user_hltv(id)) return PLUGIN_CONTINUE static entlist[3] if(find_sphere_class(id, "turret", 10.0, entlist, 2)) { if(is_turret(entlist[0]) && get_gametime() > ThinkTime[id]+0.5 && (get_sentry_owner_by_ent_id(entlist[0]) == id) && !gMenuTurretsInMenu[id] && !task_exists(entlist[0])) { static Float:Origin[3], fOrigin[3] pev(entlist[0], pev_origin, Origin) FVecIVec(Origin, fOrigin) msg_circle(id, fOrigin, gSpriteLaserBeam, {255, 255, 0}, gTurretsRange[id][get_sentry_id_by_ent(id, entlist[0])]-220) ThinkTime[id] = get_gametime() } if(get_gametime() > ThinkInfoTime[id]+2.0) { static nick[33], szTemp[64], szTurret[64], id2 id2 = get_sentry_owner_by_ent_id(entlist[0]) get_user_name(id2, nick, 32) formatex(szTemp, 63, "Wiezyczka gracza: %s", nick) if(gTurretsType[id2][get_sentry_id_by_ent(id2, entlist[0])]) { formatex(szTurret, 63, "^nTyp : %s^nAmunicja : %d", gTurretName[gTurretsType[id2][get_sentry_id_by_ent(id2, entlist[0])]], gTurretsAmmo[id2][get_sentry_id_by_ent(id2, entlist[0])]) add(szTemp, 63, szTurret) } ThinkInfoTime[id] = get_gametime() set_hudmessage(0, 255, 0, 0.31, 0.79, 1, 6.0, 2.0, _, _, 2) ShowSyncHudMsg(id, gSync4, szTemp) } } if(g_iOwnedEnt[id] && IsMovingEnt[id]) { static Float:Origin[3], Float:Origin2[3], GOrigin[3] get_user_origin(id, GOrigin, 3) IVecFVec(GOrigin, Origin)//origin IVecFVec(GOrigin, Origin2)//turn get_origin_from_dist_player(id, 45.0, Origin) Origin[2]-=36.0 set_pev(g_iOwnedEnt[id], pev_origin, Origin) sentry_turntotarget2(g_iOwnedEnt[id], Origin, Origin2) if(is_turret_stuck(g_iOwnedEnt[id])) { client_print(id, print_center, "Nie mozesz tutaj postawic tej wiezyczki!") CanDropTurret[id] = false } else CanDropTurret[id] = true; entity_set_float(g_iOwnedEnt[id], EV_FL_nextthink, 0.0) } return PLUGIN_CONTINUE } public fw_CmdStart( id, uc_handle, randseed ) { if (!is_user_alive(id)) return FMRES_IGNORED if((pev(id, pev_button) & IN_USE) && !(pev(id, pev_oldbuttons) & IN_USE)) { LastCanDropTurret[id] = !LastCanDropTurret[id] //LastCanDropTurret[id] = LastCanDropTurret[id]?!LastCanDropTurret[id]:LastCanDropTurret[id] if(LastCanDropTurret[id]) { iTime[id] = floatround(get_gametime()); cmdGrabEnt(id) } if(!LastCanDropTurret[id] && CanDropTurret[id] && ( iTime[id]+1 == floatround(get_gametime()) )) { cmdStopEnt(id) } } //else if(oldbutton & IN_USE && !(button & IN_USE) && CanDropTurret[id]) // cmdStopEnt(id return FMRES_IGNORED; }
public cmdGrabEnt(id) { client_cmd(id, "+use") new entlist[3] new ent if(find_sphere_class(id, "turret", 17.5, entlist, 2)) { ent = entlist[0] } else return PLUGIN_HANDLED if (!is_valid_ent(ent) || is_user_alive(ent)) return PLUGIN_HANDLED; static szClass[10] entity_get_string(ent, EV_SZ_classname, szClass, 9); if (!equal(szClass, "turret")) return PLUGIN_HANDLED; static Float:fOrigin[3], iAiming[3], Float:fAiming[3] get_user_origin(id, iAiming, 3); IVecFVec(iAiming, fAiming); entity_get_vector(ent, EV_VEC_origin, fOrigin); g_fOffset1[id] = fOrigin[0] - fAiming[0]; g_fOffset2[id] = fOrigin[1] - fAiming[1]; g_fOffset3[id] = fOrigin[2] - fAiming[2]; set_pev(ent,pev_rendermode,kRenderTransColor) set_pev(ent,pev_rendercolor, {255, 0, 0}) set_pev(ent,pev_renderamt, 100.0) IsMovingEnt[id] = true; g_iOwnedEnt[id] = ent client_cmd(id, "-use") return PLUGIN_HANDLED } public cmdStopEnt(id) { //client_cmd(id, "-use") if (!g_iOwnedEnt[id]) return PLUGIN_HANDLED; new ent = g_iOwnedEnt[id] set_pev(ent,pev_rendermode, kRenderNormal) set_pev(ent,pev_rendercolor, {0, 0, 0}) set_pev(ent,pev_renderamt, 255.0) g_iOwnedEnt[id] = 0; IsMovingEnt[id] = false drop_to_floor(ent) entity_set_float(ent, EV_FL_nextthink, get_gametime()+0.1) return PLUGIN_CONTINUE }
O to o co mi chodzi
1. Podchodze do wieżyczki - naciskam klawisz "E" 2. Podnoszę wieżyczke, puszczam klawisz "E" ( client_cmd(id, "+use") ) 3. Dalej trzymam tą wieżyczkę 4. Idę w inne miejsce 5. To miejsce jest zablkowane ( is_turret_stuck ) 6. Nie mogę postawić tam wieżyczki ( Naciskając drugi raz klawisz "E" ) 7. Idę w inne miejsce 8. To miejsce jest dobre i mogę tam postawić wieżyczkę 9. Postawiam wieżyczkę 10. I tak w kółko
A ten kod co dałem działa tak:
1. Podchodze do wieżyczki - naciskam klawisz "E" 2. Podnoszę wieżyczke, puszczam klawisz "E" ( client_cmd(id, "+use") ) 3. Dalej trzymam tą wieżyczkę 4. Idę w inne miejsce 5. To miejsce jest zablkowane ( is_turret_stuck ) 6. Nie mogę postawić tam wieżyczki ( Naciskając drugi raz klawisz "E" ) 7. Idę w inne miejsce 8. To miejsce jest dobre i NIE mogę tam postawić wieżyczkę 9. W ogóle nie mogę postawić nigdzie wieżyczki. 10. I tak w kółko
Gdy dam restart, żeby podnieść wieżyczkę, musze wpisać komendę do konsoli: "-use"
Czemu tak się dzieję ? Proszę o pomoc.
GwynBleidD
28.04.2013
Winowajcą jest LastCanDropTureet. Co ciekawe, zmienna ta nawet nie wykonuje czynności, którą powinna na logikę wykonywać, patrząc na jej nazwę.
LastCanDropTurret[id] = !LastCanDropTurret[id]
Zamieniasz tutaj na przeciwną wartość nie wiem po co, za każdym razem gdy naciska użytkownik E. Powinieneś chyba zamieniać na określoną wartość dopiero PO pomyślnym wykonaniu czynności, czyli podniesieniu lub upuszczeniu wieżyczki. Druga rzecz, czemu to ma służyć:
( iTime[id]+1 == floatround(get_gametime()) )
Użytkownik GwynBleidD edytował ten post 28.04.2013 17:35
GT Team
28.04.2013
2. Że może puścić dopiero po upływie 1 sec, żeby zapobiec pewnemu rodzajowi spamu
edit
Zrobiłem tak:
if((pev(id, pev_button) & IN_USE) && !(pev(id, pev_oldbuttons) & IN_USE)) { if(LastCanDropTurret[id]) { iTime[id] = floatround(get_gametime()); cmdGrabEnt(id) LastCanDropTurret[id] = false } if(!LastCanDropTurret[id] && CanDropTurret[id] && ( iTime[id]+1 == floatround(get_gametime()) )) { cmdStopEnt(id) LastCanDropTurret[id] = true } }A jednak podnoszę, i puszczam - Jest OK. Lecz nie mogę ponownie podnieść, gdyż muszę wpisać komende -use w konsoli. Gdy to zrobię to podnoszę, ale już nigdzie nie mogę jej upuścić ;(
Użytkownik PaTrIcKx edytował ten post 28.04.2013 18:16
GwynBleidD
28.04.2013
Więc przy tym iTime masz dalej błąd. nie powinno być == ale <= jak już albo bez +1, a dać warunek z < samym.
Co do konieczności wpisania -use, nie widzę nic co by powodowało taki błąd...
sebul
28.04.2013
client_cmd(id, "+use")
Przecież jest to zbędne, według mnie podnoszenie i upuszczanie można po prostu zrobić na przycisk E w taki sposób, że podchodzimy, naciskamy E (na chwilę), podnosimy, naciskamy jeszcze raz E i upuszczamy, jeśli oczywiście można. A jeszcze co do tego -use, to po prostu gdy puszczasz e, to wykonuje się ta komenda, więc skoro w kodzie masz +use, to trzeba też gdzieś mieć -use.
GT Team
29.04.2013
sebul
29.04.2013
Jak dobrze zrobisz, to nie trzeba będzie nic trzymać i nie trzeba żadnego +use w kodzie.Bo trzymanie wieżyczki jest na klawiszu E, to +use symuluje trzymanie tej wieżyczki, a -use (po naciśnięciu drugi raz klawisza E) puszcza ją. Gdyby tego +use nie było, to bym musiał cały czas trzymać E, a jednak chcę się tego pozbyć.
GT Team
29.04.2013

if(g_iOwnedEnt[id] && IsMovingEnt[id]) { static Float:Origin[3], Float:Origin2[3], GOrigin[3] get_user_origin(id, GOrigin, 3) IVecFVec(GOrigin, Origin)//origin IVecFVec(GOrigin, Origin2)//turn get_origin_from_dist_player(id, 45.0, Origin) Origin[2]-=36.0 set_pev(g_iOwnedEnt[id], pev_origin, Origin) sentry_turntotarget2(g_iOwnedEnt[id], Origin, Origin2) if(is_turret_stuck(g_iOwnedEnt[id]) || ((find_sphere_class(g_iOwnedEnt[id], "turret", 47.5, entlist2, 2)) && (entlist2[0] != g_iOwnedEnt[id]))) { client_print(id, print_center, "Nie mozesz tutaj postawic tej wiezyczki!") entity_set_model(g_iOwnedEnt[id], "models/TD/sentrygun_4.mdl") // normalny model CanDropTurret[id] = false } else { entity_set_model(g_iOwnedEnt[id], "models/TD/sentrygun_2.mdl") // zielony model CanDropTurret[id] = true; } entity_set_float(g_iOwnedEnt[id], EV_FL_nextthink, 0.0) }CmdStart
if((pev(id, pev_button) & IN_USE) && !(pev(id, pev_oldbuttons) & IN_USE)) { client_print(0, 3, "use") if(LastCanDropTurret[id]) { client_print(0, 3, "grab") iTime[id] = floatround(get_gametime()); cmdGrabEnt(id) LastCanDropTurret[id] = false } if(!LastCanDropTurret[id] && CanDropTurret[id] && ( iTime[id]+1 <= floatround(get_gametime()) )) { client_print(0, 3, "stop") cmdStopEnt(id) LastCanDropTurret[id] = true } }Grab + Stop
public cmdGrabEnt(id) { new entlist[3] new ent client_print(0, 3, "grav pre") if(find_sphere_class(id, "turret", 17.5, entlist, 2)) { if(is_turret(entlist[0])) ent = entlist[0] else if(is_turret(entlist[1])) ent = entlist[1] else if(is_turret(entlist[2])) ent = entlist[2] else return PLUGIN_CONTINUE if (!pev_valid(ent)) return PLUGIN_CONTINUE } else return PLUGIN_CONTINUE static Float:fOrigin[3], iAiming[3], Float:fAiming[3] new turret = get_sentry_id_by_ent(id, ent) entity_get_string(ent, EV_SZ_model, gTurretsGrabTempModel[id][turret], 63) get_user_origin(id, iAiming, 3); IVecFVec(iAiming, fAiming); entity_get_vector(ent, EV_VEC_origin, fOrigin); g_fOffset1[id] = fOrigin[0] - fAiming[0]; g_fOffset2[id] = fOrigin[1] - fAiming[1]; g_fOffset3[id] = fOrigin[2] - fAiming[2]; set_pev(ent,pev_rendermode,kRenderTransColor) set_pev(ent,pev_rendercolor, {0, 0, 0}) set_pev(ent,pev_renderamt, 100.0) IsMovingEnt[id] = true; g_iOwnedEnt[id] = ent client_cmd(id, "+use") client_cmd(id, "-use") client_print(0, 3, "grab post") return PLUGIN_CONTINUE } public cmdStopEnt(id) { client_print(0, 3, "stop pre") if (!g_iOwnedEnt[id] || !IsMovingEnt[id]) return PLUGIN_CONTINUE new ent = g_iOwnedEnt[id] new turret = get_sentry_id_by_ent(id, g_iOwnedEnt[id]) entity_set_model(g_iOwnedEnt[id], gTurretsGrabTempModel[id][turret]) entity_set_string(g_iOwnedEnt[id], EV_SZ_classname, "turret") set_pev(ent,pev_rendermode, kRenderNormal) set_pev(ent,pev_rendercolor, {0, 0, 0}) set_pev(ent,pev_renderamt, 255.0) g_iOwnedEnt[id] = 0; IsMovingEnt[id] = false drop_to_floor(ent) entity_set_float(ent, EV_FL_nextthink, get_gametime()+0.1) client_print(0, 3, "stop post") return PLUGIN_CONTINUE }I tutaj jak to wychodzi. 1 raz zmienie pozycję wieżyczk i działa czyli:
use grab grav pre grab post use stop stop pre stop posta tutaj, jak chcę zrobić kolejny raz:
use grab grav preSprawdzałem już różne metody. Gdy usunę zmienianie modelu ( czerwony, zielony + przywracanie w cmdStopEnt ) to wszystko pięknie działa !
GwynBleidD
03.05.2013
Z tym +use jest rozwiązanie beznadziejne. To tak jakbyś związywał komuś rękę, żeby nie puścił wieżyczki, zamiast mu powiedzieć "nie puszczaj". Zrób to na tzw toggle. Z tym kodem Ci nie pomogę, gdyż przez to +use nie da się do końca przewidzieć co się dzieje, a przynajmniej nie chce mi się, bo robisz to bardzo brzydko...
sebul
04.05.2013
Czyli to co już zostało tutaj napisane, naciskasz raz - podnosisz, naciskasz drugi raz - upuszczasz.Ok, możesz mnie bardziej na kierować na to 'toogle' ?