Hop til indhold
Stavox

ATK - Automatisk Trafikkontrol (NY VERSION)


DoktorDim

Recommended Posts

Beskrivelse

Navnet siger vel lidt sig selv? Automatisk trafikkontrol (ATK) eller bedre kendt som automatisk fartmåler. E2'en finder selv ud af fartgrænsen, så når du har sat e2'en op, så kan du bare slappe af og tjene penge på fartbøller.

 

OBS - E2'en er opdateret d. 29-07-2020, og overholder alle serverens retningslinjer!

 

Chat Commands

- APK Whitelist Kenneth Skov - Tilføjer eller fjerner X fra whitelist.

- APK Whitelist - Giver en komplet liste over alle spillere der er undtaget.

- APK Toggle - Stopper med at sende informative beskeder.

Quality of Life: I stedet for at skrive 'whitelist' kan du blot skrive 'wh' eller 'wl'. Det samme er gældende med toggle, hvor du blot kan skrive 'to' eller 'tl'.

 

Kode

Spoiler

@name Police - Automatic Traffic Control
@inputs [RangerOne, RangerTwo]:entity
@persist [Settings, Registry]:table Queue:array

if(first()){
    runOnChat(1)
    runOnFile(1)
    runOnLast(1)
    supressFineMessages(1)
    
    function void printLayout(Text:string, Force:number){
        if(Settings["Messeges", number] ?: Force){
            printColor(vec(212, 230, 0), "APK - ", vec(255), Text)
        }
    }
    
    function string moneyFormat(Amount:number, Type:string){
        local Formatted = Amount:toString()
        local Last = ""
    
        while(1){
            Formatted = Formatted:replaceRE("^(-?%d+)(%d%d%d)", "%1" + Type + "%2")
            
            if(Formatted == Last){
                break
            }
            
            Last = Formatted
        }
        
        return Formatted
    }
    
    function void pushQueue(Ent:entity, Text:string){
        if(!Queue:count()){
            timer("queue.next", 1000)
        }
        
        Queue:pushEntity(Ent)
        Queue:pushString(Text)
    }
    
    function void entity:sendFine(){
        local Ent = This:driver()
        local SteamID = Ent:steamID()
        
        if(!Ent:isPlayer() ?: Settings["Whitelist", table]:exists(SteamID)){
            return
        }
        
        local Speed = This:kmh()
        local SpeedLimit = inrange(vec2(This:pos()), vec2(-11012, -14735), vec2(-3000, -3784)) ? citySpeedLimit() : nonCitySpeedLimit()
        
        if(This:isCarStolen()){
            pushQueue(This, "say /g En stj" + aa() + "let " + This:getCarName() + " ( " + This:getPlate() + ") passerede en station" + ae() + "r fartm" +aa() + "ler. K" + oe() + "ret" + oe() + "jet er sidst set " + (SpeedLimit > 50 ? "udenfor" : "inde i") + " byen.")
        }
        
        if(Speed - 3 < SpeedLimit){
            return
        }
        
        local Fine = calculateFine(SpeedLimit, Speed)
        
        if(Ent:isWanted() & Ent:wantedReason():findRE("fartb.+de")){
            local PreviousFine = Ent:wantedReason():matchFirst("[b].+de:(.*)[k]"):replace(",", ""):toNumber()
            Fine = max(Fine + Ent:wantedReason():matchFirst("[b].+de:(.*)[k]"):replace(",", ""):toNumber(), 25000)
            
            printLayout(Ent:name() + " havde i forvejen en ubetalt fartb" + oe() + "de p" + aa() + " " + moneyFormat(PreviousFine, ".") + " kr.", 0)
        }
        
        if(!Ent:giveFine("Fartb" + oe() + "de: " + Speed + "/" + SpeedLimit + " km/t.", Fine)){
            return
        }
        
        Registry[SteamID, table] = table(
            "Vehicle" = This,
            "Speed" = Speed,
            "SpeedLimit" = SpeedLimit,
            "Fine" = Fine
        )
        
        printLayout("Fartb" + oe()+ "de udstedt til " + Ent:name() + " p" + aa() + " " + moneyFormat(Fine, ".") + " kr.", 0)
    }
    
    setName("Politi - Automatisk Trafikkontrol\nv1.1\n\nA creation by DoktorDim")
    
    if(!convarnum("wire_expression2_concmd")){
        printLayout("De har ikke aktiveret concmd, og E2'en kan derfor ikke bruges. De bedes derfor skrive 'wire_expression2_concmd 1' i konsollen.", 1)
        error("L" + ae() + "s venligst chatten!")
    }
    
    if(fileCanLoad()){
        fileLoad("sx - automatic traffic control data.txt")
    }
    
    Settings = table(
        "Messeges" = 1,
        "Whitelist" = table(
            owner():steamID() = owner()
        )
    )
    
    printLayout("E2'en er nu startet op og er klar til brug. Tak fordi du benytter dig af den!", 1)
}    


if(~RangerOne & RangerOne & RangerOne:isVehicle() & !RangerOne:elsOn()){
    RangerOne:sendFine()
}

if(~RangerTwo & RangerTwo & RangerTwo:isVehicle() & !RangerTwo:elsOn()){
    RangerTwo:sendFine()
}


elseif(clk("queue.next") & Queue:count()){
    if(Queue[1, entity]:isValid()){
        concmd(Queue[2, string])
    }
    
    else{
        timer("queue.next", 1000)
    }
    
    Queue:remove(1)
    Queue:remove(1)
}


elseif(fineClk()){
    local Ent = finePlayer()
    
    printLayout(Ent:name() + " betalte den udstedte fartb" + oe() + "de p" + aa() + " " + moneyFormat(Registry[Ent:steamID(), table]["Fine", number], ".") + " kr.", 0)
}

elseif(fineNoClk()){
    local Ent = finePlayer()
    local SteamID = Ent:steamID()
    
    if(Ent:isPlayer()){
        if(Ent:isWanted()){
            pushQueue(Ent, "say /unwanted " + SteamID)
        }
        
        local Table = Registry[SteamID, table]
        
        Ent:setFine(Table["Fine", number])
        
        pushQueue(Ent, "say /wanted " + SteamID + " [auto] Manglende fartb" + oe() + "debetaling | Fart: " + Table["Speed", number] + "/" + Table["SpeedLimit", number] + " km/t | B" + oe() + "de: " + moneyFormat(Table["Fine", number], ",") + "kr.")
        
        if(Table["Vehicle", entity]:isVehicle()){
            pushQueue(Ent, "say /g " + Ent:name() + " betale ikke en udstedt fartb" + oe() + "de. Vedkommende var sidst set k" + oe() + "rende i en " + Table["Vehicle", entity]:getCarName() + " ( " + Table["Vehicle", entity]:getPlate() + ") " + (Table["SpeedLimit", number] > 50 ? "udenfor" : "inde i") + " byen.")
        }
    }
}


elseif(chatClk()){
    if(Queue:count()){
        timer("queue.next", 1000)
    }
    
    local LastSaid = lastSaid():lower():explode(" ")
    
    if(LastSaid[1, string]:find("apc") ?: LastSaid[1, string]:find("apk")){
        hideChat(1)
        
        if(LastSaid[2, string]:find("whitelist") ?: LastSaid[2, string]:find("wh") ?: LastSaid[2, string]:find("wl")){
            if(LastSaid[3, string]:length()){
                local LastSaid = lastSaid()
                local LastSaid = LastSaid:sub(LastSaid:find(" ") + 1, LastSaid:length())
                local LastSaid = LastSaid:sub(LastSaid:find(" ") + 1, LastSaid:length())
                local Ent = findPlayerByName(LastSaid)
    
                if(Ent:isPlayer()){
                    if(Ent != owner()){
                        local SteamID = Ent:steamID()
                        
                        if(Settings["Whitelist", table]:exists(SteamID)){
                            Settings["Whitelist", table]:remove(SteamID)
                            
                            printLayout(Ent:name() + " vil ikke l" + ae() + "ngere v" + ae() + "re p" + aa() +" undtagelseslisten.", 1)
                        }
                        
                        else{
                            Settings["Whitelist", table][SteamID, entity] = Ent
                            printLayout(Ent:name() + " er nu p" + aa() +" undtagelseslisten.", 1)
                        }
                    }
                    
                    else{
                        printLayout("Du kan fjerne dig selv fra undtagelseslisten.", 1)
                    }
                }
        
                else{
                    printLayout("Personen " + LastSaid + " blev ikke fundet.", 1)
                }
            }
            
            else{
                local Plys = array()
                
                foreach(K, V:entity = Settings["Whitelist", table]){
                    local Ent = findPlayerBySteamID(K)
                    
                    if(!Ent:isPlayer()){
                        Settings["Whitelist", table]:remove(K)
                        continue
                    }
                    
                    elseif(Ent == owner()){
                        continue
                    }
                    
                    Plys:pushEntity(Ent)
                }
                
                local Count = Plys:count()
                local List = ""
                
                if(Count){
                    if(Count > 1){
                        for(I = 1, Count){
                            if(I == Count){
                                List = List + " og " + Plys[I, entity]:name()
                                
                                break
                            }
                            
                            List = List + ", " + Plys[I, entity]:name()
                        }
                        
                        printLayout(List:sub(3, List:length()) + " er p" + aa() +" undtagelseslisten.", 1)
                    }
                    
                    else{
                        printLayout(Plys[1, entity]:name() + " er p" + aa() +" undtagelseslisten.", 1)
                    }
                }
                
                else{
                    printLayout("Ingen personer er p" + aa() +" undtagelseslisten.", 1)
                }
            }
        }
        
        elseif(LastSaid[2, string]:find("toggle") ?: LastSaid[2, string]:find("to") ?: LastSaid[2, string]:find("tl")){
            if(Settings["Messeges", number]){
                Settings["Messeges", number] = 0
                
                printLayout("De vil nu ikke l" +ae() + "ngere modtage informative beskeder.", 1)
            }
            
            else{
                Settings["Messeges", number] = 1
                
                printLayout("De vil nu igen modtage informative beskeder.", 1)
            }
        }
        
        else{
            printLayout("F" + oe() + "lgende kommandoer kan bruges:\n- APK Whitelist Kenneth Jensen\n- APK Whitelist\n- APK Toggle", 1)
        }
    }
}



elseif(last() & fileCanWrite()){
    fileWrite("sx - automatic traffic control data.txt", vonEncode(Settings))
}

elseif(fileClk() & fileLoaded()){
    Settings = vonDecodeTable(fileRead())
    
    printLayout("Tidligere gemte indstillinger blev indl" + ae() + "st.", 1)
}

elseif(duped() & !dupefinished()){
    reset()
}

 

 

Arkiv

Spoiler

@name Police - Automatic Traffic Control
@inputs [RangerOne, RangerTwo]:entity
@persist [Whitelist, Registry]:table Queue:array

if(first()){
    runOnChat(1)
        
    function void printLayout(Messege:string){
        printColor(vec(212, 230, 0), "POLITI - ", vec(255), Messege)
    }
    
    function string moneyFormat(Amount:number, Type:string){
        local Formatted = Amount:toString()
        local Last = ""
    
        while(1){
            Formatted = Formatted:replaceRE("^(-?%d+)(%d%d%d)", "%1" + Type + "%2")
            
            if(Formatted == Last){
                break
            }
            
            Last = Formatted
        }
        
        return Formatted
    }
    
    function void entity:sendFine(){
        local Ent = This:driver()
        local SteamID = Ent:steamID()
        
        if(!Ent:isPlayer() ?: Whitelist:exists(SteamID)){
            return
        }
        
        local Speed = This:kmh()
        local SpeedLimit = inrange(vec2(This:pos()), vec2(-11012, -14735), vec2(-3000, -3784)) ? citySpeedLimit() : nonCitySpeedLimit()
        
        if(Speed - 3 < SpeedLimit){
            return
        }
        
        local Fine = calculateFine(SpeedLimit, Speed)
        
        if(Ent:isWanted() & Ent:wantedReason():findRE("fartb.+de")){
            local PreviousFine = Ent:wantedReason():matchFirst("[b].+de: (.*)[k]"):replace(",", ""):toNumber()
            Fine = Fine + PreviousFine > 25000 ? 25000 : Fine + PreviousFine
            
            printLayout(Ent:name() + " havde i forvejen en ubetalt fartb " + oe() + "de p" + aa() + " " + moneyFormat(PreviousFine, ".") + " kr.")
        }
        
        Ent:giveFine("Fartb" + oe() + "de", Fine)
        
        Registry[SteamID, table] = table(
            "vehicle" = This,
            "speed" = Speed,
            "speedLimit" = SpeedLimit,
            "fine" = Fine
        )
        
        printLayout("Fartb" + oe()+ "de udstedt til " + Ent:name() + " p" + aa() + " " + moneyFormat(Fine, ".") + " kr.")
    }
    
    function void pushQueue(Ent:entity, Messege:string){
        if(!Queue:count()){
            timer("queue.next", 1000)
        }
        
        Queue:pushEntity(Ent)
        Queue:pushString(Messege)
    }
    
    setName("Politi - Automatisk Trafikkontrol\nv1.0\n\nA creation by DoktorDim")
}    
    

if(~RangerOne & RangerOne & RangerOne:isVehicle() & !RangerOne:elsOn()){
    RangerOne:sendFine()
}

if(~RangerTwo & RangerTwo & RangerTwo:isVehicle() & !RangerTwo:elsOn()){
    RangerTwo:sendFine()
}


if(clk("queue.next") & Queue:count()){
    if(Queue[1, entity]:isPlayer()){
        concmd(Queue[2, string])
    }
    
    Queue:remove(1)
    Queue:remove(1)
}


if(fineClk()){
    local Ent = finePlayer()
    
    printLayout(Ent:name() + " betalte den udstedte fartb" + oe() + "de p" + aa() + " " + moneyFormat(Registry[Ent:steamID(), table]["fine", number], ".") + " kr.")
}

elseif(fineNoClk()){
    local Ent = finePlayer()
    local SteamID = Ent:steamID()
    
    if(Ent:isPlayer()){
        if(Ent:isWanted()){
            pushQueue(Ent, "say /unwanted " + SteamID)
        }
        
        Ent:setFine(Registry[SteamID, table]["fine", number])
        
        pushQueue(Ent, "say /wanted " + SteamID + " [auto] Manglende fartb" + oe() + "debetaling | Fart: " + Registry[SteamID, table]["speed", number] + "/" + Registry[SteamID, table]["speedLimit", number] + " km/t | B" + oe() + "de: " + moneyFormat(Registry[SteamID, table]["fine", number], ",") + "kr.")
        
        if(Registry[SteamID, table]["vehicle", entity]:isVehicle()){
            pushQueue(Ent, "say /g " + Ent:name() + " valgte ikke at betale en udstedt fartb" + oe() +"de. Vedkommende var sidst set k" + oe() + "rende i en " + Registry[SteamID, table]["vehicle", entity]:getCarName() + ".")
        }
    }
}


if(chatClk()){
    if(Queue:count()){
        timer("queue.next", 1000)
    }

    local LastSaid = lastSaid():lower():explode(" ")

    if(LastSaid[1, string]:find("whitelist") ?: LastSaid[1, string]:find("wh") ?: LastSaid[1, string]:find("wl")){
        hideChat(1)
        
        if(LastSaid[2, string]:length()){
            local LastSaid = lastSaid():sub(lastSaid():find(" ") + 1, lastSaid():length())
            local Ent = findPlayerByName(LastSaid) ?: findPlayerBySteamID(LastSaid)

            if(Ent:isPlayer()){
                local SteamID = Ent:steamID()
                
                if(Whitelist:exists(SteamID)){
                    Whitelist:remove(SteamID)
                    
                    printLayout(Ent:name() + " vil ikke l" + ae() + "ngere v" + ae() + "re undtaget fra ATK-systemet.")
                }
                
                else{
                    Whitelist[SteamID, entity] = Ent
                    
                    printLayout(Ent:name() + " er nu undtaget fra ATK-systemet.")
                }
            }
    
            else{
                printLayout("Personen " + LastSaid + " blev ikke fundet.")
            }
        }
        
        else{
            local Ents = array()
            
            foreach(K, V:entity = Whitelist){
                if(!V:isPlayer()){
                    Whitelist:remove(K)
                    
                    continue
                }
                
                Ents:pushEntity(V)
            }
            
            local Count = Ents:count()
            local List = ""
            
            if(Count){
                if(Count > 1){
                    for(I = 1, Count){
                        if(I == Count){
                            List = List + " og " + Ents[I, entity]:name()
                            
                            break
                        }
                        
                        List = List + ", " + Ents[I, entity]:name()
                    }
                    
                    printLayout(List:sub(3, List:length()) + " er undtaget fra ATK-systemet.")
                }
                
                else{
                    printLayout(Ents[1, entity]:name() + " er undtaget fra ATK-systemet.")
                }
            }
        }
    }
    
}


if(duped() & !dupefinished()){
    reset()
}

 

 

Andre anbefalede E2'er til Politijobbet

 

 

ATK - Automatisk Trafikkontrol.zip

Link til kommentar
22 minutter siden, Nooah skrev:

Nogen mulighed for at man automatisk bliver wanted, hvis man ikke betaler fartbøden?

Noget jeg har overset, eller er E2'en ikke kodet sådan?

Det ser ud til, at man bliver wanted, hvis man ikke betaler sin bøde.

pushQueue(Ent, "say /wanted " + SteamID + " [auto] Manglende fartb" + oe() + "debetaling | Fart: " + Registry[SteamID, table]["speed", number] + "/" + Registry[SteamID, table]["speedLimit", number] + " km/t | B" + oe() + "de: " + moneyFormat(Registry[SteamID, table]["fine", number], ",") + "kr.")
Link til kommentar

@DoktorDim Hej Dim, det er et meget nice E2 Fartmåling-system du har lagt op, der er dog lige det, at der fornyeligt er blevet tilføjet en ret træls regel, om at en E2 skal fortælle den fart man kørte, da man blev målt.

Og jeg blev så kontaktet af en admin igår omkring dette, og da jeg tjekket denne nye ændring til reglen, fandt jeg ud af, at denne her E2 desværre ikke helt er lovlig, ud fra at folk fortæller at de ikke få deres fart at vide, når de bliver målt.

Citat

"E2 fartmålere skal fortælle hvilken fart man kørte, da man blev målt." - Regel 15.15

Så derfor ville jeg lige spørge dig, om du måske hvis du havde lyst og tid til det, så kunne ændre lidt, eller lave om i E2en så den overholder de gældende regler, da den vil være nice at kunne bruge, når man samtidig godt må bruge den.

Link til kommentar

Changelog - v1.1

- Tjekker nu om man har "wire_expression2_concmd" aktiveret i konsollen.

- Informere nu betjente, hvis en stjålet bil passere en af de stationære fartmålere.

- Man kan nu slå informative beskeder fra, så man ikke bliver spammet i chatten.

- Gemmer den tidligere undtagelsesliste, samt om man vil have informative beskeder.

- Chat-kommandoer skal nu skrives med enten "apk" eller "apc" foran.

- Man vil ikke længere modtage følgende beskeder: "Der er lige givet en bøde til denne spiller. Vent lidt.". @Dynn

- Man kan nu se hvor stærkt man kørte, da man blev målt.

Dupes er blevet opdateret med den nye version af E2'en.

Link til kommentar
  • 4 weeks later...

Din "Lokation; Hotel & Midtby [sx].txt" (Btw, det er også motellet*)

Er ulovlig, da rangeren går ind over flere vejbaner og skråt over vejen.

https://i.imgur.com/ARe0j1f.png

Citat

17.15

En fartmåler må kun måle et enkelt område på én vej. Fartmålere må kun registrere fart ved hjælp af en ranger (E2 funktion inkluderet), og må derfor ikke f.eks registrere alt indenfor et sæt koordinater.
Rangeren skal være placeret så dens range går tværs over vejen, og du må derfor ikke bare placere en ranger i den ene ende af en vej, og opfange alle biler på hele vejstrækningen.
E2 fartmålere skal fortælle hvilken fart man kørte, da man blev målt.

 

Link til kommentar
1 time siden, Pablo Badekar skrev:

Den må da godt gå over 2 vejbaner, er reglen ikke bare imod at den gå langs vejen?

Den må godt gå over 2 vejbaner, men ikke over 2 veje som vidst i billedet.

Hvis du kigger på billeder peger rangeren ikke tværs over vejen.

 

"Rangeren skal være placeret så dens range går tværs over vejen,"

Link til kommentar
2 timer siden, MicGirl skrev:

Den må godt gå over 2 vejbaner, men ikke over 2 veje som vidst i billedet.

Hvis du kigger på billeder peger rangeren ikke tværs over vejen.

 

"Rangeren skal være placeret så dens range går tværs over vejen,"

Du har helt ret, misforstod bare din kommentar, og kunne ikke lige åbne billedet

Link til kommentar

Arkiveret

Dette emne er nu arkiveret og er lukket for yderligere svar

×
×
  • Tilføj...

COOKIE- OG PRIVATLIVSPOLITIK PÅ STAVOX.DK

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privatlivspolitik - Vilkår for brug.