KFARGChat

Тема в разделе "Общего назначения", создана пользователем F4TAL1ST, 4 апр 2011.

  1. F4TAL1ST

    F4TAL1ST ---

    KFARGChat

    Просто и гениально:
    [​IMG]
    Когда кто-то из игроков пишет в чате сообщение, то над его головой будет появляться "примечательная" иконка.
    Подобные вещи должны быть в игре изначально, а не добавляться в виде мутаторов.
    Надеемся этот мутатор сделают белым :unsure:

    Скачать
     
  2. b1ohaz

    b1ohaz Солдат

    Я стобой согласен)))) Подожду когда Фрэгл докачает медика)))тогда уже и поставлю этот мут))
     
  3. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    Понтовско. А если я буду через микрофон бдеть - окошко будет?
    Хотя во время стоящей битвы - когда мутанты везде, то при общении не оч удобка смотреть на собеседника. Эт наверно так для баловства, вот если бы это облако с репликой приплывало в мое поле зрения - был бы Бум! :teehee:
     
  4. Rayman

    Rayman Бандит

    На сколько я знаю максимальное число лвл - 6, это что за новинка такая на скрине?
     
  5. Папка01

    Папка01 ۞ Всевидящее око форума ۞

    Это с собственными перками - СерверПеркс. Бывают и с черепами, и с крыльями, синие, красные - любые короче..
     
  6. b1ohaz

    b1ohaz Солдат

    Но все же если краем глаза смотреть то полезно.а в не котором смысле мут не доработан))) а в целом +
     
  7. Essence

    Essence Moderator Команда форума

    Обновил реализацию мутатора.

    Скриншот:
    [​IMG]

    Настройки в .ini файле:
    ChatIconTexture - путь к текстуре.
    bDisplayFrom3rdP - отображать ли иконку от 3-го лица.
    ScaleX - сдвиг по оси X.
    ScaleY - сдвиг по оси Y.
    ScaleW - множитель для ширины.
    ScaleH - множитель для высоты.

    Код с комментариями:
    Код:
    class ChatIconMut extends Mutator
        Config(ChatIconMut);
    
    #exec obj load file="ChatIconTex.utx" Package="ChatIconMut"
    
    var config string ChatIconTexture;
    var config bool bDisplayFrom3rdP;
    var config float ScaleX, ScaleY;
    var config float ScaleW, ScaleH;
    
    // Настройки лежат на сервере, а используются на клиенте
    replication
    {
        reliable if(bNetDirty && Role==Role_Authority)
            ChatIconTexture, ScaleX, ScaleY, ScaleW, ScaleH, bDisplayFrom3rdP;
    }
    
    // Интеракшн для отображения иконки
    simulated function Tick(float DeltaTime)
    {
        local ChatIconInteraction CII;
        local PlayerController PC;
        PC=Level.GetLocalPlayerController();
         if(PC!=None)
        {
            // Вручаем игроку интеракшн
            CII=ChatIconInteraction(PC.Player.InteractionMaster.AddInteraction("ChatIconMut.ChatIconInteraction", PC.Player));
            // Добавили интеракшн, передаем настройки
            if(CII!=None) CII.SetSettings(ScaleX, ScaleY, ScaleW, ScaleH, ChatIconTexture, bDisplayFrom3rdP);
            // Вырубаем для игрока тик
            Disable('Tick');
        }
        if(Role==Role_Authority) Disable('Tick'); // Тик на сервере не выполняется
    }
    
    defaultproperties
    {
        GroupName="KF-ChatIconMut"
        FriendlyName="Chat Icon Mutator"
        Description="Shows an icon on top of a player when he is using chat"
        bAlwaysRelevant=True
        RemoteRole=ROLE_SimulatedProxy
        bNetNotify=True
        bAddToServerPackages=True
    }
    Код:
    class ChatIconInteraction extends Interaction;
    
    var bool bUse3rd;
    var Texture ChatIconTex;
    var PlayerController OwnerPC;
    var float ScaleX, ScaleY;
    var float ScaleW, ScaleH;
    
    // Стандартная функция, получаем PlayerController владельца
    function Initialize()
    {
        OwnerPC=ViewportOwner.Actor;
        if(OwnerPC==None) Master.RemoveInteraction(Self);
    }
    
    // Стандартная функция
    event NotifyLevelChange()
    {
        Master.RemoveInteraction(Self);
    }
    
    // Стандартная функция
    event Initialized()
    {
        ChatIconTex=None;
        ScaleX=0;
        ScaleY=0;
        ScaleW=0;
        ScaleH=0;
    }
    
    // Получаем значения настроек из мутатора
    simulated function SetSettings(float ValueX, float ValueY, float ValueW, float ValueH, string ChatIconPackage, bool b3rd)
    {
        ChatIconTex=Texture(DynamicLoadObject(ChatIconPackage, Class'Texture'));
        ScaleX=ValueX;
        ScaleY=ValueY;
        ScaleW=ValueW;
        ScaleH=ValueH;
        bUse3rd=b3rd;
    }
    
    // Если игроки находятся в зоне видимости (20 м), то вызываем DrawChatIcon
    simulated function PostRender(Canvas C)
    {
        local Rotator CamRot;
        local Vector CamPos, ViewDir, ScreenPos;
        local KFHumanPawn KFHP;
        C.GetCameraLocation(CamPos,CamRot);
        ViewDir=Vector(CamRot);
        ForEach OwnerPC.VisibleCollidingActors(Class'KFHumanPawn', KFHP, 1000.f, CamPos)
        {
            KFHP.bNoTeamBeacon=True;
            // В случае если владелец - наблюдатель
            // Сравниваем контроллеры во избежание спама Pawn is None
            if(KFHP.Controller!=OwnerPC && KFHP.PlayerReplicationInfo!=None && KFHP.Health>0 && ((KFHP.Location-CamPos) Dot ViewDir)>0.8)
            {
                ScreenPos=C.WorldToScreen(KFHP.Location+Vect(0,0,1)*KFHP.CollisionHeight);
                if(ScreenPos.X>=0 && ScreenPos.Y>=0 && ScreenPos.X<=C.ClipX && ScreenPos.Y<=C.ClipY)
                    DrawChatIcon(C, KFHP, ScreenPos.X, ScreenPos.Y);
            }
        }
        // Отображение иконки от 3-го лица для владельца
        if(bUse3rd)
        {
            // В случае если владелец - наблюдатель
            if(OwnerPC.Pawn!=None)
            {
                ScreenPos=C.WorldToScreen(OwnerPC.Pawn.Location+Vect(0,0,1)*OwnerPC.Pawn.CollisionHeight);
                DrawChatIcon(C, KFHumanPawn(OwnerPC.Pawn), ScreenPos.X, ScreenPos.Y);
            }
        }
    }
    
    // Рисуем иконку если у игрока открыт чат
    simulated function DrawChatIcon(Canvas C, KFHumanPawn KFHP, float ScreenLocX, float ScreenLocY)
    {
        local HUDKillingFloor KFHUD;
        local float Dist;
        local byte BeaconAlpha;
        local float TempX, TempY;
        KFHUD=HUDKillingFloor(OwnerPC.myHUD);
        Dist=VSize(KFHP.Location-OwnerPC.CalcViewLocation);
        Dist-=KFHUD.HealthBarFullVisDist;
        Dist=FClamp(Dist, 0, KFHUD.HealthBarCutoffDist-KFHUD.HealthBarFullVisDist);
        Dist=Dist/(KFHUD.HealthBarCutoffDist-KFHUD.HealthBarFullVisDist);
        BeaconAlpha=byte((1.f-Dist)*255.f);
        if(BeaconAlpha==0) Return;
        if(KFHP.bIsTyping)
        {
            if(ChatIconTex!=None)
            {
                TempX=ScreenLocX-ChatIconTex.MaterialUSize()/ScaleW;
                TempY=ScreenLocY-ChatIconTex.MaterialVSize()/ScaleH;
                C.SetPos(TempX, TempY);
                C.Style=KFHUD.ERenderStyle.STY_Alpha; // Interaction наследует Object, а не Actor, тип рендера получаем из худа игрока
                C.SetDrawColor(255, 255, 255, BeaconAlpha);
                C.DrawTile(ChatIconTex, ChatIconTex.MaterialUSize()*ScaleX, ChatIconTex.MaterialVSize()*ScaleY, 0, 0, ChatIconTex.MaterialUSize(), ChatIconTex.MaterialVSize());
            }
        }
    }
    
    defaultproperties
    {
        bVisible=True // Обязательно
    }
    

    Код для загрузки мутатора в .bat файле или MutLoader:
    Код:
    ChatIconMut.ChatIconMut

    Ссылка
     
    Flame, Arckon., WipeMaster и 2 другим нравится это.