Message Panels : der neue Planet : Technische Hilfe : Skript für 4-Sitzer-Möbel (zwei Paare) |
<< | <First | < | <prev. | > | next.> | >> | Last> | Rep | Reply | ^ | Discussion ^ | v | Discussion v | Del | Delete the discussion |
Sascha | Sascha | 28/04 | Sent: 28/04/2024 22:42:02 | 1 / 1 | Message 1 from 1 |
Dieses Skript ist besser als das alte, wenn wir auf das Möbelstück klicken, setzt sich der Avatar auf die nächstgelegene Sitzposition, und dies (im Gegensatz zum vorherigen Skript) unabhängig von den x,y,z des Netzes // Skript für 4-Sitzer-Möbel (zwei Paare) const int SIT_PLACES = 4; // wie viele Personen sitzen können (muss ein Vielfaches von 2 sein) const int MAX_ANIMS = 1; // wie viele Animationen auf jedem Sitzplatz struct SIT { vector pos; Vektorrot; string(20) anim; } Typ ROW ist SIT[SIT_PLACES]; // *** für Couch *** const ROW g_sit[MAX_ANIMS] = { { {pos => {0.4, -1.4, 1.4}, // Sitzplatz 1 rot => {0.0, 0.0,65.0}, anim => "beachchair2-f-A2"}, {pos => {0.35, 0.80, 0.60}, // Sitz 2 rot => {0.0, 0.0, -90.0}, anim => "seat2"}, {pos => { 0.45, -0.70, 0.60}, // Sitz 3 rot => {0.0, 0.0, -90.0}, anim => "seat2-A1"}, {pos => {0.25, 1.8, 1.40}, // Sitz 4 rot => {3.2, 0.8, 0.0}, anim => "beachchair2-f-A3"}, }, }; //------------------------------------------------ ------- const key NULL_KEY = {0,0,0,0}; int[SIT_PLACES/2] g_anim_set; // Animationsset (0 bis MAX_ANIMS-1) key[SIT_PLACES] g_avatar; //------------------------------------------------ ------- // Tabelle aktualisieren g_avatar: alle Avatare entfernen, die nicht mehr sitzen void update_avatars() { sitter s; int i; bool valid[SIT_PLACES]; klar gültig; while (get_sitter (out s)) { for (i=0; i<SIT_PLACES; i++) { if (same_key (s.avatar, g_avatar[i])) valid[i] = true; } } for (i=0; i<SIT_PLACES; i++) { if (!valid[i]) g_avatar[i] = NULL_KEY; } } //--------------------------------------------- - --------- void sit_avatar (int anim, int ava, key k) { if (sit (mesh_nr => 1, position => g_sit[anim][ava].pos, rotation => g_sit[ anim ][ava].rot, avatar => k)) { start_animation (g_sit[anim][ava].anim, k); g_avatar[ava] = k; } } //--------------------------------------------- - --------- // muss Sitzplatz von 0 auf SIT_PLACES-1 zurückgeben int touched_place () { int i, Sitzplatz; float dist, best_dist; Vektor tt = touched_mesh_position(); float dx, dy, dz; Sitz = 0; best_dist = 999999999.0; for (i=0; i<SIT_PLACES; i++) { if (!same_key (g_avatar[i], NULL_KEY)) // genommen continue; dx = tt.x - g_sit[0][i].pos.x; dy = tt.y - g_sit[0][i].pos.y; dz = tt.z - g_sit[0][i].pos.z; dist = dx*dx + dy*dy + dz*dz; if (dist < best_dist) { Seat = i; best_dist = dist; } } return Seat; } //-------------------------------- - -------- event touch() { key k = touched_avatar(); if (is_sitting(k)) { unsitting(k); } else { int ava; update_avatars(); ava = touched_place(); if (same_key (g_avatar[ava], NULL_KEY)) // noch niemand da sitzt { sit_avatar (anim => g_anim_set[ava/2], ava => ava, k => k); } } } //------------------------------ ---------- event click_avatar() { int i, h; Schlüssel-Ava; update_avatars(); // berechne i = sitzender Avatar-Index ava = clicked_avatar(); for (i=0; i<SIT_PLACES; i++) { if (same_key (g_avatar[i], ava)) break; } if (i >= SIT_PLACES) return; // Vorausanimation für Paare mit i h = i/2; g_anim_set[h]++; if (g_anim_set[h] == MAX_ANIMS) g_anim_set[h] = 0; // Paar aktualisieren für (i=h*2; i<h*2+2; i++) { if (!same_key (g_avatar[i], NULL_KEY)) sit_avatar (anim => g_anim_set[h], ava => i , k => g_avatar[i]); } } //--------------------------------------------- - --------- |
<< | <First | < | <prev. | > | next.> | >> | Last> | Rep | Reply | ^ | Discussion ^ | v | Discussion v | Del | Delete the discussion |