This site is a testing version, but all data is shared with the live forum.


Raised This Month: $ Target: $400
 0% 

[TF2] Player-Following Annotations Snippet


  
 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Author Message
404UserNotFound
BANNED
Join Date: Dec 2011
Old 12-29-2013 , 17:59   [TF2] Player-Following Annotations Snippet
Reply With Quote #1

So I started working on something I was calling Admin Anno-tags (combination of Annotation and Tags). Then I ran into an issue where the annotations were visible through walls, and at any distance, so I gave up on it.

I also originally had some code in there to hide the annotations when a player died, but I didn't do it properly, so if a player died, all annotations would disappear for them. Once an admin respawned, the annotations would re-appear to that player. It was incredibly glitchy. So I commented it out.

Luckily, I was smart enough to keep the code, so I've decided to post it here. I know that Geit's Annotations plugin was unapproved, and people are wanting that to be fixed, so hopefully my code can be of some use.

NOTE 1: Some code was taken from that excellent Gravestone Markers plugin made by Friagram, in regards to the Bitstring stuff, that I was having trouble with.

NOTE 2: If you do make a plugin using any of this code, you do NOT have to give me credit. You can if you want to, but I don't find it necessary. Do give credit to Friagram though, he deserves it!

PHP Code:
// Massive credit to Friagram for his Gravestone Markers plugin. Without that, I wouldn't have gotten this far!

#include <sourcemod>
#include <sdktools>
#include <tf2_stocks>

#pragma semicolon 1

#define PLUGIN_VERSION "1.0"
#define SOUND_NULL    "vo/null.wav"

public Plugin:myinfo =
{
    
name "[WIP] Annotation Admin Tags",
    
author "abrandnewday",
    
description "Adds neat little annotation tags for admins",
    
version PLUGIN_VERSION,
}

public 
OnPluginStart()
{
    
HookEvent("player_spawn"Event_PlayerSpawn);
//    HookEvent("player_death", Event_PlayerDeath);
}

/*
// Event: Plugin has been unloaded, hide annotations.
public OnPluginEnd()
{
    for (new i=1; i <= MaxClients; i++)
    {
        HideAnnotation(i);
    }
}
*/

// Event: Player has spawned, check if they're an admin, and if so, assign the annotation.
public Action:Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast
{
    new 
user GetEventInt(event"userid");
    new 
client GetClientOfUserId(user);
    
    if(
GetUserFlagBits(client) && ADMFLAG_GENERIC
    {
        
ShowAnnotation(client);
    }
    return 
Plugin_Continue;
}

/*
// Event: Player has died, hide the annotation.
public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    new user = GetEventInt(event, "userid");
    new client = GetClientOfUserId(user);

    if(GetUserFlagBits(client) && ADMFLAG_GENERIC)
    {
        HideAnnotation(client);
    }
    return Plugin_Continue;
}
*/

// Function: Show the annotation!
ShowAnnotation(client)
{
    for (new 
i=1<= MaxClientsi++)
    {
        new 
bitstring RoundFloat(Pow(2.0float(i)));
        if (
bitstring 1)
        {
            new 
Handle:event CreateEvent("show_annotation");
            if (
event != INVALID_HANDLE)
            {
                
SetEventFloat(event"lifetime"999999.0); // Long-ass lifetime.
                
SetEventInt(event"id"i);
                
SetEventString(event"text""Admin"); // Displays "Admin" in the annotation
                
SetEventInt(event"visibilityBitfield"bitstring);
                
SetEventInt(event"follow_entindex"client); // Follow the player
                
SetEventString(event"play_sound"SOUND_NULL);
                
SetEventBool(event"show_distance"100); // Not sure what the distance is measured in
                
FireEvent(event);
            }
        }
    }
}

/*
// Function: Hide Annotation
HideAnnotation(client)
{
    new Handle:event = CreateEvent("hide_annotation");
    if(event == INVALID_HANDLE) return;
    SetEventInt(event, "id", client);
    FireEvent(event);
}
*/

// Function: Build Bitstring for visibility
public BuildBitString(Float:position[3])
{
    new 
bitstring 1;
    for (new 
client=1client <= MaxClientsclient++)
    {
        if (
IsClientInGame(client))
        {
            
decl Float:EyePos[3];
            
GetClientEyePosition(clientEyePos);
            if (
GetVectorDistance(positionEyePos) < 400)
            {
                
bitstring |= RoundFloat(Pow(2.0float(client)));
            }
        }
    }
    return 
bitstring;
}

/*
// Old bitstring code I used to use.
DoFilter(client)
{
    new bitstring;
    for(new viewer = 1; viewer <= MaxClients; viewer++)
    {
        if(client == viewer) continue;
        if(IsClientInGame(viewer) && IsPlayerAlive(viewer) && IsWithinRange(client, viewer))
        {
            bitstring |= (1 << viewer);
        }
    }
    return bitstring;
}

bool:IsWithinRange(client, viewer)
{
    new Float:clientpos[3], Float:viewerpos[3];
    GetClientAbsOrigin(client, clientpos);
    GetClientAbsOrigin(viewer, viewerpos);
    if(GetVectorDistance(clientpos, viewerpos) <= 500.0) return true;
    else return false;

*/ 

Last edited by 404UserNotFound; 12-29-2013 at 18:00.
404UserNotFound is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 16:45.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode