Das Deutsche Fun Universum UFR
Messages
Guest_53382
Das Deutsche Fun Universum UFR
 
Messages
3D Chat
Mini-Chat

Message Panels : der neue Planet : Technische Hilfe : Skript für 4-Sitzer-Möbel (zwei Paare)
<<<First<<prev.>next.>>>Last>RepReply^Discussion ^vDiscussion vDelDelete the discussion
SaschaSascha28/04Sent: 28/04/2024 22:42:021 / 1Message 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>RepReply^Discussion ^vDiscussion vDelDelete the discussion