can anyone tell me how to fix this "shaking" effect when you stand next to the block-zone or on it? how to make it totally SOLID? i sometimes use it to make a little platforms, but it doesn't allow to stand still, you're always get shaky. i can't find a part of the code that is responsible for the zone properties... please help me, there's no other place to ask for help.
frwl
05-14-2018 07:47
Re: WalkGuard FIX
anyone?.. please ;(
lazarev
05-14-2018 08:21
Re: WalkGuard FIX
First of, entities with EF_NODRAW flag enabled on pev_effects parameter are not being networked to client hence shakiness effect.
Second, bbox should be reduced slightly for some reason when creating entities with SOLID_BBOX..
new zone_color_aktiv[3] = { 0, 0, 255 } new zone_color_red[3] = { 255, 0, 0 } new zone_color_green[3] = { 255, 255, 0 }
// alle Zonen #define MAXZONES 100 new zone[MAXZONES] new maxzones // soviele existieren new index // die aktuelle Zone
// Editier-Funktionen new setupunits = 10 // Дnderungen an der GrцЯe um diese Einheiten new direction = 0 // 0 -> X-Koorinaten / 1 -> Y-Koords / 2 -> Z-Koords new koordinaten[3][] = { "TRANSLATE_X_KOORD", "TRANSLATE_Y_KOORD", "TRANSLATE_Z_KOORD" }
new spr_dot // benцtigt fьr die Lininen
new editor = 0 // dieser Spieler ist gerade am erstellen .. Menь verkraftet nur einen Editor
new camperzone[33] // letzte Meldung der CamperZone new Float:campertime[33] // der erste Zeitpunkt des eintreffens in die Zone new Float:camping[33] // der letzte Zeitpunkt des campens
public plugin_precache() { precache_model("models/gib_skull.mdl") spr_dot = precache_model("sprites/dot.spr") }
public client_disconnect(player) { // aus irgend welchen Grьnden ist der Spieler einfach wech........ if (player == editor) HideAllZones() }
public Event_FreezeTime() { roundstatus = RS_FREEZETIME }
public Event_RoundStart() { roundstatus = RS_RUNNING
// CPU schonen und die Variablen am Anfang gleich merken slap_damage = get_pcvar_num(pcv_damage) slap_direction = get_pcvar_num(pcv_direction) slap_botdamage = get_pcvar_num(pcv_botdamage) slap_botdirection = get_pcvar_num(pcv_botdirection) admin_immunity = get_pcvar_num(pcv_immunity) icon_damage = get_pcvar_num(pcv_damageicon) }
public Event_RoundEnd() { roundstatus = RS_END }
// ----------------------------------------------------------------------------------------- // // WalkGuard-Action // // -> hier ist alles was passiert // // ----------------------------------------------------------------------------------------- public fw_touch(zone, player) { if (editor) return FMRES_IGNORED
if (!pev_valid(zone) || !is_user_connected(player)) return FMRES_IGNORED
//log_amx("create zone '%s' with campertime %i seconds", zonename[ZONEMODE:zm], campertime)
return entity }
public CreateNewZone(Float:position[3]) { new Float:mins[3] = { -31.99, -31.99, -31.99 } new Float:maxs[3] = { 31.99, 31.99, 31.99 } return CreateZone(position, mins, maxs, 0, 10); // ZM_NONE }
public CreateZoneOnPlayer(player) { // Position und erzeugen new Float:position[3] pev(player, pev_origin, position)
new entity = CreateNewZone(position) FindAllZones()
for(new i = 0; i < maxzones; i++) if (zone[i] == entity) index = i; }
// ----------------------------------------------------------------------------------------- // // Load & Save der WGZ // // ----------------------------------------------------------------------------------------- public SaveWGZ(player) { new zonefile[200] new mapname[50]
public ShowAllZones() { FindAllZones() // zur Sicherheit alle suchen
for(new i = 0; i < maxzones; i++) { new z = zone[i] remove_task(TASK_BASIS_SHOWZONES + z) set_pev(z, pev_solid, SOLID_NOT) set_task(0.2, "ShowZoneBox", TASK_BASIS_SHOWZONES + z, _, _, "b") } }
public ShowZoneBox(entity) { entity -= TASK_BASIS_SHOWZONES if ((!fm_is_valid_ent(entity)) || !editor) return
// Koordinaten holen new Float:pos[3] pev(entity, pev_origin, pos) if (!fm_is_in_viewcone(editor, pos) && (entity != zone[index])) return // sieht der Editor eh nicht
// jetzt vom Editor zur Zone testen... Zonen hinter der Wand aber im ViewCone // mьssen nicht gezeichnet werden new Float:editorpos[3] pev(editor, pev_origin, editorpos) new Float:hitpoint[3] // da ist der Treffer fm_trace_line(-1, editorpos, pos, hitpoint)
// Linie zur Zone zeichnen ... dann wird sie schneller gefunden if (entity == zone[index]) DrawLine(editorpos[0], editorpos[1], editorpos[2] - 16.0, pos[0], pos[1], pos[2], { 255, 0, 0} )
// Distanz zum Treffer ... ist Wert grцЯer dann war da etwas new Float:dh = vector_distance(editorpos, pos) - vector_distance(editorpos, hitpoint) if ( (floatabs(dh) > 128.0) && (entity != zone[index])) return // hinter einer Wand
new ent = get_tr2(0, TR_pHit) get_tr2(0, TR_vecEndPos, ret)
return pev_valid(ent) ? ent : 0 }
frwl
05-14-2018 13:52
Re: WalkGuard FIX
Quote:
Originally Posted by lazarev
(Post 2592121)
Spoiler
First of, entities with EF_NODRAW flag enabled on pev_effects parameter are not being networked to client hence shakiness effect.
Second, bbox should be reduced slightly for some reason when creating entities with SOLID_BBOX..
new zone_color_aktiv[3] = { 0, 0, 255 }
new zone_color_red[3] = { 255, 0, 0 }
new zone_color_green[3] = { 255, 255, 0 }
// alle Zonen
#define MAXZONES 100
new zone[MAXZONES]
new maxzones // soviele existieren
new index // die aktuelle Zone
// Editier-Funktionen
new setupunits = 10 // Дnderungen an der GrцЯe um diese Einheiten
new direction = 0 // 0 -> X-Koorinaten / 1 -> Y-Koords / 2 -> Z-Koords
new koordinaten[3][] = { "TRANSLATE_X_KOORD", "TRANSLATE_Y_KOORD", "TRANSLATE_Z_KOORD" }
new spr_dot // benцtigt fьr die Lininen
new editor = 0 // dieser Spieler ist gerade am erstellen .. Menь verkraftet nur einen Editor
new camperzone[33] // letzte Meldung der CamperZone
new Float:campertime[33] // der erste Zeitpunkt des eintreffens in die Zone
new Float:camping[33] // der letzte Zeitpunkt des campens
public plugin_precache() {
precache_model("models/gib_skull.mdl")
spr_dot = precache_model("sprites/dot.spr")
}
public client_disconnect(player) {
// aus irgend welchen Grьnden ist der Spieler einfach wech........
if (player == editor) HideAllZones()
}
public Event_FreezeTime() {
roundstatus = RS_FREEZETIME
}
public Event_RoundStart() {
roundstatus = RS_RUNNING
// CPU schonen und die Variablen am Anfang gleich merken
slap_damage = get_pcvar_num(pcv_damage)
slap_direction = get_pcvar_num(pcv_direction)
slap_botdamage = get_pcvar_num(pcv_botdamage)
slap_botdirection = get_pcvar_num(pcv_botdirection)
admin_immunity = get_pcvar_num(pcv_immunity)
icon_damage = get_pcvar_num(pcv_damageicon)
}
public Event_RoundEnd() {
roundstatus = RS_END
}
// -----------------------------------------------------------------------------------------
//
// WalkGuard-Action
//
// -> hier ist alles was passiert
//
// -----------------------------------------------------------------------------------------
public fw_touch(zone, player) {
if (editor) return FMRES_IGNORED
if (!pev_valid(zone) || !is_user_connected(player))
return FMRES_IGNORED
//log_amx("create zone '%s' with campertime %i seconds", zonename[ZONEMODE:zm], campertime)
return entity
}
public CreateNewZone(Float:position[3]) {
new Float:mins[3] = { -31.99, -31.99, -31.99 }
new Float:maxs[3] = { 31.99, 31.99, 31.99 }
return CreateZone(position, mins, maxs, 0, 10); // ZM_NONE
}
public CreateZoneOnPlayer(player) {
// Position und erzeugen
new Float:position[3]
pev(player, pev_origin, position)
new entity = CreateNewZone(position)
FindAllZones()
for(new i = 0; i < maxzones; i++) if (zone[i] == entity) index = i;
}
// -----------------------------------------------------------------------------------------
//
// Load & Save der WGZ
//
// -----------------------------------------------------------------------------------------
public SaveWGZ(player) {
new zonefile[200]
new mapname[50]
public ShowAllZones() {
FindAllZones() // zur Sicherheit alle suchen
for(new i = 0; i < maxzones; i++)
{
new z = zone[i]
remove_task(TASK_BASIS_SHOWZONES + z)
set_pev(z, pev_solid, SOLID_NOT)
set_task(0.2, "ShowZoneBox", TASK_BASIS_SHOWZONES + z, _, _, "b")
}
}
public ShowZoneBox(entity) {
entity -= TASK_BASIS_SHOWZONES
if ((!fm_is_valid_ent(entity)) || !editor) return
// Koordinaten holen
new Float:pos[3]
pev(entity, pev_origin, pos)
if (!fm_is_in_viewcone(editor, pos) && (entity != zone[index])) return // sieht der Editor eh nicht
// jetzt vom Editor zur Zone testen... Zonen hinter der Wand aber im ViewCone
// mьssen nicht gezeichnet werden
new Float:editorpos[3]
pev(editor, pev_origin, editorpos)
new Float:hitpoint[3] // da ist der Treffer
fm_trace_line(-1, editorpos, pos, hitpoint)
// Linie zur Zone zeichnen ... dann wird sie schneller gefunden
if (entity == zone[index]) DrawLine(editorpos[0], editorpos[1], editorpos[2] - 16.0, pos[0], pos[1], pos[2], { 255, 0, 0} )
// Distanz zum Treffer ... ist Wert grцЯer dann war da etwas
new Float:dh = vector_distance(editorpos, pos) - vector_distance(editorpos, hitpoint)
if ( (floatabs(dh) > 128.0) && (entity != zone[index])) return // hinter einer Wand